Testen Sie die Integrität der TAR-Datei in Bash

25

Ich habe ein Bash-Skript, das eine TAR-Datei erstellt. Sobald die Datei erstellt ist, möchte ich ihre Integrität testen und eine E-Mail an den Root-Benutzer senden, wenn die Integrität schlecht ist.

Ich weiß, ich müsste den Befehl verwenden tar -tf /root/archive.tar, um die Integrität der Datei zu überprüfen, aber wie würde ich dies in einer Bash-if-Anweisung implementieren und nach Fehlern suchen?

Chris
quelle

Antworten:

33

Wenn tarbei der Eingabe Fehler festgestellt werden, wird exit(3)¹ mit einem Exit-Wert ungleich Null ausgegeben. Dies targeschieht - bei den meisten Implementierungen - auch bei der Auflistung von Archivinhalten mit t. Sie können also einfach nach dem Exit-Wert von suchen, tarum festzustellen, ob ein Fehler aufgetreten ist:

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

Wenn Ihr tarnicht alle Fehler mit finden t, können Sie immer noch das Archiv extrahieren stdoutund Umleitung stdoutzu /dev/null, die die langsamere , aber zuverlässiger Ansatz wäre:

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

¹ Diese Notation kennzeichnet die Manpage, nicht den eigentlichen Aufruf. Sehen man 3 exit.

Andreas Wiese
quelle
1
Wahrscheinlich möchten Sie die tarAusgabe an umleiten /dev/null, da Sie sie wahrscheinlich nicht wirklich sehen möchten.
Kevin
1
Nicht alle tarImplementierungen erkennen oder melden alle Fehler mit t( bsdtarnicht, Sie können tar xOf file.tar > /dev/nulldort verwenden). Nicht alle tarImplementierungen würden mit dem Exit-Status 2 star(255) oder bsdtar(1) beendet werden. Entscheidend ist jedoch, dass der Exit-Status hier ungleich Null ist.
Stéphane Chazelas
1
Ich habe meinen Beitrag entsprechend bearbeitet. Bei exit(2)mir wurde bezüglich der entsprechenden Manpage nicht der exakte Exit-Wert angegeben (weshalb ich im folgenden Satz »ungleich Null« explizit erwähnt hatte). Kommentierte dies (und änderte den Abschnitt nach rechts -.-).
Andreas Wiese
Ihre Antwort ist nur über die Fähigkeit der Auflistung und Extraktion, wenn ich tar-Archiv mit einem Editor öffne und etwas ändere, wird Ihre Lösung keine Art von Fehler fangen ... Entschuldigung
THESorcerer
0

Entschuldigung, aber Sie können nicht, es scheint, dass tar nicht die Fähigkeit zum Testen besitzt (wenn Sie zum Beispiel * nix vergessen und versuchen, es mit winrar zu testen, lautet das Ergebnis: "Der Befehl wird für diese Art von Archiv nicht unterstützt")

Wie ich in den obigen Kommentaren ausgeführt habe, fehlt tar buchstäblich die interne CRC, um eine Vergleichsbedingung zu haben. Wenn Sie also ein Tar-Archiv mit einem Editor ändern, funktionieren Auflistung und Extraktion möglicherweise fehlerfrei, extrahieren jedoch beschädigte Daten

Abschließend hoffe ich hier auf eine Lösung, aber es gibt keine, zum Glück gibt es zwei gute Neuigkeiten:

Es gibt sehr, sehr SEHR seltene Tar-Archive, die nicht auch mit einem anderen Programm (wie gzip, bzip2 usw.) komprimiert wurden. Daher wird dieses Programm eine Testlösung haben und Leute, die sie nicht komprimieren, sind irgendwie lahm, WIRKLICH LAME

Für mein persönliches Problem hatte ich das Glück, dass ich nach dem Extrahieren nur eine md5sum-Datei mit CRC aller darin enthaltenen Dateien gefunden habe (selbst die Person, die arhive tar ins Netz gestellt hat und es nicht komprimieren wollte, wollte es immer noch sein verifiziert werden können)

Der Zauberer
quelle
-5

Sie können dies tun, indem Sie die folgenden Argumente an übergeben tar:

$ tar -cvzf test.tar test_file
sudeepta roy
quelle
2
Einzeilige Antworten sind oft nicht so hilfreich. Erwägen Sie, Ihren Beitrag um Quellmaterial (z. B. Dokumentation) zu erweitern, das Ihre Lösung unterstützt.
HalosGhost
6
-cerstellt die Datei mit dem Namen via -f('test.tar'). -zgzippt das Archiv. -vmacht es wortreich. Ich bin mir ziemlich sicher, dass dies keine genaue Lösung ist.
EpicVoyage