Przetestuj integralność pliku tar w bash

25

Mam skrypt bash, który tworzy plik „.tar”. Po utworzeniu pliku chciałbym przetestować jego integralność i wysłać wiadomość e-mail do użytkownika root, jeśli integralność jest zła.

Wiem, że musiałbym użyć polecenia, tar -tf /root/archive.taraby sprawdzić integralność pliku, ale jak mam to zaimplementować w instrukcji bash if i sprawdzić, czy nie ma błędów?

Chris
źródło

Odpowiedzi:

33

W przypadku tarznalezienia błędów na wejściu będzie exit(3)¹ z niezerową wartością wyjściową. Dzieje się tak - w przypadku większości tarimplementacji - również podczas wyświetlania zawartości archiwum t. Możesz więc po prostu sprawdzić wartość wyjściową, taraby ustalić, czy coś poszło nie tak:

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

Jeśli tarnie znajdziesz wszystkich błędów t, nadal możesz wyodrębnić archiwum stdouti przekierować stdoutdo niego /dev/null, co byłoby wolniejszym, ale bardziej niezawodnym podejściem:

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

¹ Ten zapis oznacza stronę podręcznika, a nie rzeczywiste połączenie. Zobaczyć man 3 exit.

Andreas Wiese
źródło
1
Prawdopodobnie będziesz chciał przekierować tarwyjście /dev/null, ponieważ prawdopodobnie nie chcesz go zobaczyć.
Kevin
1
Nie wszystkie tarimplementacje wykrywają lub zgłaszają wszystkie błędy za pomocą t( bsdtarnie, można tar xOf file.tar > /dev/nulltam użyć ). Nie wszystkie tarimplementacje zakończyłyby się ze statusem wyjścia 2, star(255) ot bsdtar(1) nie, ale ważne jest to, że status wyjścia jest tutaj niezerowy.
Stéphane Chazelas
1
Zredagowałem odpowiednio mój post. Z exit(2)zostałem odnośnie do odpowiedniego podręcznika, a nie dokładną wartość exit (dlatego miałem »niezerową« wyraźnie wymienione w zdaniu). Zanotował to (i zmienił sekcję na prawą -.-).
Andreas Wiese
twoja odpowiedź dotyczy tylko możliwości wylistowania i wypakowania, jeśli otworzę archiwum tar w edytorze i zmienię coś, twoje rozwiązanie nie
wykryje
0

przepraszam, ale nie możesz, wygląda na to, że tar nie ma możliwości testowania (na przykład jeśli zapomnisz o * nix i spróbujesz przetestować go za pomocą winrar, wynik będzie następujący: „Polecenie nie jest obsługiwane dla tego typu archiwum”)

jak wskazałem w komentarzach powyżej, tar dosłownie nie ma wewnętrznego CRC, aby mieć termin porównania, dlatego jeśli zmienisz archiwum tar za pomocą edytora, wyświetlanie i rozpakowywanie może działać bezbłędnie bez błędów, ale wyodrębniać uszkodzone dane

Podsumowując, kończę tutaj, mając nadzieję na rozwiązanie, ale nie ma jednego, na szczęście są dwie dobre wiadomości:

istnieją bardzo, bardzo BARDZO rzadkie archiwa tar, które nie są również kompresowane z innym programem (takim jak gzip, bzip2 itp.), dlatego ten program będzie miał rozwiązanie testowe, a ludzie, którzy go nie kompresują, są trochę lamani, NAPRAWDĘ LAME

na mój osobisty problem, mam szczęście, po wypakowaniu go właśnie znalazłem plik md5sum z CRC wszystkich plików w nim zawartych (nawet osoba, która umieściła tar w arhive i nie chciała go skompresować, nadal chciał być możliwe do zweryfikowania)

Czarnoksiężnik
źródło
-5

Możesz to zrobić, przekazując następujące argumenty do tar:

$ tar -cvzf test.tar test_file
sudeepta roy
źródło
2
Odpowiedzi w jednym wierszu często nie są zbyt pomocne. Zastanów się nad poszerzeniem swojego postu o materiał źródłowy (np. Dokumentację), który obsługuje twoje rozwiązanie.
HalosGhost
7
-ctworzy plik o nazwie via -f(„test.tar”). -zgzips archiwum. -vsprawia, że ​​jest pełny. Jestem prawie pewien, że to nie jest dokładne rozwiązanie.
EpicVoyage,