Проверить целостность ZIP-файла?

21

Насколько я могу судить, опция zip -T определяет только возможность извлечения файлов - на самом деле архив не проверяется на внутреннюю целостность. Например, я умышленно повредил локальный (не центральный каталог) CRC для файла, и zip это не заботило, сообщив об архиве как о ОК. Есть ли какая-нибудь другая утилита для этого?

В ZIP-файлах много внутренней избыточности, и было бы неплохо иметь возможность проверить все это. Конечно, обычно центральный каталог - это все, что вам нужно, но при восстановлении поврежденного архива часто все, что у вас есть, это фрагмент, при котором центральный каталог забит или отсутствует. Я хотел бы знать, насколько архивы, которые я создаю, можно восстановить.

Марк Рочкинд
источник
2
Как насчет unzip -t?
FloHimself
Такое же поведение, как у почтового индекса.
Марк Рочкинд

Ответы:

20

распаковать -t

Тестовые архивные файлы.

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

[источник: https://linux.die.net/man/1/unzip ]

Теофраст
источник
В каждом файле 2 CRC: локальный и центральный. unzip -tтолько проверяет последнее.
Марк Рочкинд
2
я не знаю, что вы подразумеваете под "локальным" по сравнению с "центральным" (центральным для чего?), но когда я запускаю "unzip -t myzip_file.zip", я вижу строку вывода для комментирования целостности каждого и каждого заархивированного файла , вроде (представьте себе лучшее форматирование): "testing: AARiseTransitSet.cpp OK тестирование: AARiseTransitSet.h OK тестирование: AASaturn.cpp OK тестирование: AASaturn.h ОК ...
Theophrastus
Не место, чтобы объяснить внутреннюю структуру файлов ZIP. Статья Wikepedia довольно хороша в этом. Как я уже сказал, это вводящее в заблуждение сообщение, которое вы видите.
Марк Рочкинд
Если я захожу в zip-файл с помощью hex-редактора и изменяю один байт, то я вижу для одного файла: testing: AA_sphere.htm bad CRC 7952862e (должно быть 44c6f7f8), в то время как остальные перечислены как «ОК». вы будете продолжать объявлять это «вводящим в заблуждение», но это именно то, что я ожидаю от проверки файла CRC для файла zip. Теперь ... удачи вам, сэр.
Феофраст
Я думаю, что вы изменили центральный каталог CRC, в конце. Попробуйте изменить локальный, до или после файла.
Марк Рочкинд,
12

Попытка исправить архив будет сравнивать локальные и центральные CRC, а сочетание с тестами архива позволит проверить все CRC. Если вы бежите

unzip -t archive.zip

а также

zip -F archive.zip --out archivefix.zip

и ни один не жалуется, что означает, что содержимое архива соответствует как центральному, так и локальному CRC. (Вы можете удалить archivefix.zipпотом.)

Чтобы убедиться в этом, начиная с исходного кода Info-ZIP для zip3.0, я создал файл следующим образом:

zip -9 test.zip zip.txt zipup.c

Затем я повредил CRC центрального каталога zip.txt, изменив байт со смещением 0xB137. Я получил поведение, противоположное тому, что вы наблюдали; unzip -vсообщил об измененном CRC из центрального каталога, но unzip -tи zip -Tсообщил, что файл в порядке (проверка на соответствие локальному CRC).

Но работает

zip -F test --out testfix

сообщается

Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
 copying: zip.txt
        zip warning: Local Entry CRC does not match CD: zip.txt
 copying: zipup.c

В «исправленном» файле все еще указан измененный CRC для zip.txt.

Изменение локального CRC для zip.txtсмещения 0x10 вызвало и то unzip -tи другое и zip -Tсообщило об ошибке CRC, но zip -Fне обнаружило ничего неправильного.

Таким образом, из моих экспериментов несоответствия между содержимым записи архива и его CRC могут быть обнаружены следующим образом:

  • только местный: zip -Tи unzip -t; zip -Fтакже будет жаловаться на местно-центральное несоответствие
  • местный и центральный: zip -Tиunzip -t
  • только центральный: zip -Tи unzip -tне будет жаловаться, но zip -Fукажет на местно-центральное несоответствие

(Обратите внимание , что по умолчанию zip -Tпросто использует unzip -tqq, так zip -Tи на unzip -tсамом деле эквивалентны Вы можете прочитать. unzipИсходный код , чтобы проверить , что тестирование архива действительно сравнивает локальный CRC, а не центральный, искать extract_or_test_files(), extract_or_test_entrylist()и extract_or_test_member(), все extract.c.)

Стивен Китт
источник
Сложный. И, без сомнения, очень зависит от того, какие версии (GNU, BSD и т. Д.) И CRC - это только одна из многочисленных проверок целостности, которые могут быть выполнены.
Марк Рочкинд,
1
Существует не так много версий zipи unzipдоступных на Unix-подобных платформах; Info-ZIP используется почти везде ...
Стивен Китт
1
Насколько это сложно, требуется всего две команды; если оба unzip -tи zip -Fработают без ошибок, вы в порядке, и оба CRC были проверены.
Стивен Китт
Благодарность! Проверим это. Кроме того, забыл упомянуть: ZIP файлы ZIP64.
Марк Рочкинд,