Перевірка цілісності ZIP-файлу?


21

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

В ZIP-файлах багато внутрішнього надмірності, і було б непогано мати спосіб перевірити все це. Звичайно, як правило, центральний каталог - це все, що вам потрібно, але при ремонті зіпсованого архіву часто все, що у вас є, є фрагментом, центральний каталог якого забито або відсутнє. Мені хотілося б знати, чи архіви, які я створюю, максимально відновлюються.


2
Про що unzip -t?
FloHimself

Така ж поведінка, як і блискавка.
Марк Рочкінд

Відповіді:


20

unzip -t

Перевірка архівних файлів.

Ця опція витягує кожен заданий файл у пам'яті та порівнює CRC (циклічна перевірка надмірності, розширена контрольна сума) розгорнутого файлу із збереженим значенням CRC оригіналу.

[джерело: https://linux.die.net/man/1/unzip ]


У файлі є 2 CRC: локальні та центральні. unzip -tтільки тестує останнє.
Марк Рочкінд

2
я не знаю, що ви маєте на увазі під "локальним" порівняно з "центральним" (центральним для чого?), але коли я запускаю "unzip -t myzip_file.zip", я бачу вихідний рядок для коментування цілісності кожного зішпареного файлу , наприклад (уявіть собі краще форматування): "тестування: AARiseTransitSet.cpp ОК тестування: AARiseTransitSet.h ОК тестування: AASaturn.cpp ОК тестування: AASaturn.h ОК ...
Теофраст

Не місце пояснення внутрішньої структури ZIP-файлів. Стаття у Вікіпедії щодо цього досить гарна. Як я вже сказав, ви бачите помилковий звіт.
Марк Рочкінд

Якщо я заходжу в zip-файл із шестнадцятковим редактором і змінюю один байт, то я бачу один файл: тестування: AA_sphere.htm неправильний CRC 7952862e (має бути 44c6f7f8), а решта вказані як "ОК". Ви продовжуватимете заявляти про це як "оманливе", але саме цього я очікую для перевірки поштового CRC файлу zip. зараз ... удачі вам, сер.
Теофраст

Я думаю, ви змінили центральний каталог CRC, наприкінці. Спробуйте змінити локальний, до або після файлу.
Марк Рочкінд

12

Спроба виправити архів порівнятиме локальні та центральні CRC, а поєднання цього з тестами архіву дозволить перевірити всі CRC. Якщо ти біжиш

unzip -t archive.zip

і

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

і не скаржаться, це означає, що вміст архіву відповідає як центральній, так і місцевій ЦРЛ. (Ви можете 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.
Марк Рочкінд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.