Tester l'intégrité du fichier tar dans bash

25

J'ai un script bash qui crée un fichier '.tar'. Une fois le fichier créé, je voudrais tester son intégrité et envoyer un email à l'utilisateur root si l'intégrité est mauvaise.

Je sais que je devrais utiliser la commande tar -tf /root/archive.tarpour vérifier l'intégrité du fichier, mais comment pourrais-je l'implémenter dans une instruction bash if et vérifier les erreurs?

Chris
la source

Réponses:

33

Si tartrouve des erreurs dans son entrée, il sera exit(3)¹ avec une valeur de sortie non nulle. Cela - avec la plupart des tarimplémentations - est également effectué lors de la liste du contenu des archives avec t. Vous pouvez donc simplement vérifier la valeur de sortie de tarpour déterminer si quelque chose s'est mal passé:

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

Si votre tarne trouve pas toutes les erreurs avec t, vous pouvez toujours extraire l'archive vers stdoutet rediriger stdoutvers /dev/null, ce qui serait l'approche la plus lente mais la plus fiable:

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

¹ Cette notation indique la page de manuel, pas l'appel réel. Tu vois man 3 exit.

Andreas Wiese
la source
1
Vous voudrez probablement rediriger la tarsortie vers /dev/null, car vous ne voulez probablement pas la voir.
Kevin
1
Toutes les tarimplémentations ne détectent pas ou ne signalent pas toutes les erreurs avec t( bsdtarnon, vous pouvez les utiliser tar xOf file.tar > /dev/null). Toutes les tarimplémentations ne se termineraient pas avec l'état de sortie 2, star(255) ou bsdtar(1) non, mais ce qui importe, c'est que l'état de sortie est non nul ici.
Stéphane Chazelas
1
J'ai modifié mon message en conséquence. En exit(2)ce qui concerne la page de manuel appropriée, pas la valeur de sortie exacte (c'est pourquoi j'avais «non nul» explicitement mentionné dans la phrase suivante). Annoté cela (et changé la section à droite -.-).
Andreas Wiese
votre réponse ne concerne que la capacité de listage et d'extraction, si j'ouvre l'archive tar avec un éditeur et que je modifie quelque chose, votre solution ne détectera aucune erreur ... désolé
THESorcerer
0

désolé, mais vous ne pouvez pas, semble que tar n'a pas la capacité de tester (par exemple, si vous oubliez * nix et essayez de le tester avec winrar, le résultat sera: "La commande n'est pas prise en charge pour ce type d'archive")

comme je l'ai souligné dans les commentaires ci-dessus, tar manque littéralement CRC interne pour avoir un terme de comparaison, donc si vous changez une archive tar avec un éditeur, la liste et l'extraction peuvent fonctionner sans erreur sans erreur, mais extraire les données corrompues

en conclusion, je me retrouve ici dans l'espoir d'une solution, mais il n'y en a pas, heureusement il y a deux bonnes nouvelles:

il y a des archives tar très, très, TRÈS rares qui ne sont pas également compressées avec un autre programme (comme gzip, bzip2, etc.) donc ce programme aura une solution de test et les gens qui ne les compressent pas sont un peu boiteux, VRAIMENT LAME

pour mon problème personnel, j'ai de la chance, après l'avoir extrait, je viens de trouver un fichier md5sum avec CRC de tous les fichiers à l'intérieur (même la personne qui a mis du tar arhive sur le net et ne voulait pas le compresser, il voulait toujours être vérifiable)

Le sorcier
la source
-5

Vous pouvez le faire en passant les arguments suivants à tar:

$ tar -cvzf test.tar test_file
sudeepta roy
la source
2
Les réponses en une seule ligne ne sont souvent pas très utiles. Envisagez d'élargir votre publication pour inclure du matériel source (par exemple, de la documentation) qui prend en charge votre solution.
HalosGhost
7
-ccrée le fichier nommé via -f('test.tar'). -zgzips l'archive. -vle rend verbeux. Je suis sûr que ce n'est pas une solution précise.
EpicVoyage