Проверка целостности tar-файла в bash

25

У меня есть скрипт bash, который создает файл .tar. Как только файл создан, я хотел бы проверить его целостность и отправить электронное письмо пользователю root, если целостность плохая.

Я знаю, что мне нужно было бы использовать команду tar -tf /root/archive.tarдля проверки целостности файла, но как бы я реализовал это в операторе bash if и проверил ошибки?

Крис
источник

Ответы:

33

Если tarобнаружит ошибки на входе, он будет exit(3)иметь ненулевое значение выхода. Это - с большинством tarреализаций - также делается при перечислении содержимого архива с t. Таким образом, вы можете просто проверить выходное значение, tarчтобы определить, что-то пошло не так:

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

Если ваш tarне находит все ошибки с помощью t, вы все равно можете извлечь архив stdoutи перенаправить stdoutего /dev/null, что будет более медленным, но более надежным подходом:

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

No Эта запись обозначает man-страницу, а не фактический вызов. См man 3 exit.

Андреас Визе
источник
1
Вы, вероятно, захотите перенаправить tarвывод /dev/null, так как вы, вероятно, на самом деле не хотите его видеть.
Кевин
1
Не все tarреализации обнаруживают или сообщают обо всех ошибках t( bsdtarнет, вы можете использовать их tar xOf file.tar > /dev/nullтам). Не все tarреализации будут выходить со статусом выхода 2, star(255) ot bsdtar(1) нет, но важно то, что статус выхода здесь не равен нулю.
Стефан Шазелас
1
Я отредактировал свой пост соответственно. С exit(2)меня в отношении к соответствующей странице руководству, а не точное значения выхода (именно поэтому я имел »ненулевой« явно упоминается в следующем предложении). Аннотировал это (и изменил раздел на правый -.-).
Андреас Визе
Ваш ответ касается только возможности распечатки и извлечения, если я открою tar-архив с редактором и что-то изменю, ваше решение не
обнаружит
0

извините, но вы не можете, кажется, что tar не имеет возможности тестирования (например, если вы забыли о * nix и попытались протестировать его с помощью winrar, результатом будет: «Команда не поддерживается для этого типа архива»)

как я указывал в комментариях выше, tar буквально не имеет внутреннего CRC, чтобы иметь термин сравнения, поэтому, если вы измените архив tar с редактором, листинг и извлечение могут работать без ошибок, но извлекать поврежденные данные

В заключение я в конечном итоге надеюсь на решение, но его нет, к счастью, есть две хорошие новости:

есть очень, очень, ОЧЕНЬ редкие tar-архивы, которые также не сжимаются другой программой (например, gzip, bzip2 и т. д.), поэтому у этой программы будет решение для тестирования, и люди, которые их не сжимают, довольно неубедительны, ДЕЙСТВИТЕЛЬНО ГЛАВНЫЕ

из-за моей личной проблемы, мне повезло, после распаковки я просто нашел файл md5sum с CRC всех файлов внутри (даже тот, кто поместил архив tar в сеть и не хотел его сжимать, все равно хотел быть можно проверить)

THESorcerer
источник
-5

Вы можете сделать это, передав следующие аргументы tar:

$ tar -cvzf test.tar test_file
судепта рой
источник
2
Ответы в одну строку часто не так полезны. Подумайте о расширении своего поста, включив в него некоторый исходный материал (например, документацию), который поддерживает ваше решение.
HalosGhost
7
-cсоздает файл с именем via -f('test.tar'). -zархив gzips -vделает это многословным. Я уверен, что это не точное решение.
EpicVoyage