Probar la integridad del archivo tar en bash

25

Tengo un script bash que crea un archivo '.tar'. Una vez que se crea el archivo, me gustaría probar su integridad y enviar un correo electrónico al usuario raíz si la integridad es mala.

Sé que necesitaría usar el comando tar -tf /root/archive.tarpara verificar la integridad del archivo, pero ¿cómo podría implementar esto en una declaración bash if y verificar si hay errores?

Chris
fuente

Respuestas:

33

Si tarencuentra errores en su entrada, exit(3)¹ tendrá un valor de salida distinto de cero. Esto, con la mayoría de las tarimplementaciones, también se realiza cuando se enumera el contenido del archivo t. Entonces, simplemente puede verificar el valor de salida de tarpara determinar si algo salió mal:

if ! tar tf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

Si tu tarno encuentra todos los errores con t, todavía se podía extraer el archivo a stdouty redirección stdouta /dev/null, lo que sería el enfoque más lento pero más confiable:

if ! tar xOf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

¹ Esta notación denota la página de manual, no la llamada real. Ver man 3 exit.

Andreas Wiese
fuente
1
Probablemente querrá redirigir la tarsalida /dev/null, ya que probablemente no quiera verla.
Kevin
1
No todas las tarimplementaciones detectan o informan todos los errores con t( bsdtarno, puede usar tar xOf file.tar > /dev/nullallí). No todas las tarimplementaciones saldrían con el estado de salida 2, star(255) o bsdtar(1) no, pero lo que importa es que el estado de salida no es cero aquí.
Stéphane Chazelas
1
Edité mi publicación en consecuencia. Con exit(2)respecto a la página de manual apropiada, no el valor de salida exacto (es por eso que tuve »no cero« mencionado explícitamente en la siguiente oración). Anotó esto (y cambió la sección a la correcta -.-).
Andreas Wiese
su respuesta es solo sobre la capacidad de listado y extracción, si abro el archivo tar con un editor y cambio algo, su solución no detectará ningún tipo de error ... lo siento
THESorcerer
0

lo siento, pero no puede, parece que tar carece de la capacidad de prueba (por ejemplo, si se olvida de * nix e intenta probarlo con winrar, el resultado será: "El comando no es compatible con este tipo de archivo")

Como señalé en los comentarios anteriores, tar literalmente carece de CRC interno para tener un término de comparación, por lo tanto, si cambia un archivo tar con un editor, el listado y la extracción pueden funcionar sin problemas sin error, pero extraer datos corruptos

En conclusión, termino aquí esperando una solución, pero no hay una, afortunadamente hay dos buenas noticias:

hay archivos muy, muy, muy raros de alquitrán que no están comprimidos con otro programa (como gzip, bzip2, etc.), por lo tanto, ese programa tendrá una solución de prueba y las personas que no los comprimen son un poco cojos, REALMENTE LAME

para mi problema personal, tengo suerte, después de extraerlo, acabo de encontrar un archivo md5sum con CRC de todos los archivos dentro (incluso la persona que puso el alquitrán de arhive en la red y no quería comprimirlo, todavía quería estar capaz de ser verificado)

El hechicero
fuente
-5

Puede hacerlo pasando los siguientes argumentos a tar:

$ tar -cvzf test.tar test_file
sudeepta roy
fuente
2
Las respuestas de una línea a menudo no son tan útiles. Considere expandir su publicación para incluir material fuente (por ejemplo, documentación) que respalde su solución.
HalosGhost
66
-ccrea el archivo llamado via -f('test.tar'). -zGzips el archivo. -vlo hace detallado. Estoy bastante seguro de que esta no es una solución precisa.
EpicVoyage