Testować integralność pliku ZIP?

21

Prawie jak mogę powiedzieć, opcja zip -T określa tylko, czy pliki można wyodrębnić - tak naprawdę nie testuje archiwum pod kątem wewnętrznej integralności. Na przykład celowo zepsułem lokalny (nie centralny katalog) CRC dla pliku, a zip nie dbał wcale, zgłaszając archiwum jako OK. Czy można to zrobić w inny sposób?

W plikach ZIP jest dużo wewnętrznej nadmiarowości i dobrze byłoby mieć sposób na sprawdzenie tego wszystkiego. Oczywiście, zwykle potrzebujesz centralnego katalogu, ale przy naprawie uszkodzonego archiwum często wszystko, co masz, to fragment, z zablokowanym lub brakującym centralnym katalogiem. Chciałbym wiedzieć, czy archiwa, które tworzę, są tak łatwe do odzyskania, jak to możliwe.

Marc Rochkind
źródło
2
Co unzip -t?
FloHimself 18.04.2015
Takie samo zachowanie jak zip.
Marc Rochkind

Odpowiedzi:

20

rozpakuj -t

Przetestuj pliki archiwów.

Ta opcja wyodrębnia każdy określony plik z pamięci i porównuje CRC (cykliczna kontrola nadmiarowa, rozszerzona suma kontrolna) rozwiniętego pliku z zapisaną wartością CRC oryginału.

[źródło: https://linux.die.net/man/1/unzip ]

Theophrastus
źródło
Istnieją 2 CRC na plik: lokalny i centralny. unzip -ttestuje tylko to drugie.
Marc Rochkind,
2
nie wiem, co rozumiesz przez „lokalny” kontra „centralny” (centralny do czego?), ale kiedy uruchamiam „unzip -t myzip_file.zip”, widzę wyjście liniowe do komentowania integralności każdego skompresowanego pliku , jak (wyobraź sobie lepsze formatowanie): „testowanie: AARiseTransitSet.cpp OK testowanie: AARiseTransitSet.h testowanie OK: AASaturn.cpp testowanie OK: AASaturn.h OK ...
Theophrastus
Nie miejsce do wyjaśnienia wewnętrznej struktury plików ZIP. Artykuł w Wikepedia jest całkiem niezły. Jak powiedziałem, jest to mylący raport, który widzisz.
Marc Rochkind,
Jeśli wejdę do pliku zip z edytorem szesnastkowym i zmienię jeden bajt, to zobaczę jeden plik: testowanie: AA_sphere.htm zły CRC 7952862e (powinien być 44c6f7f8), podczas gdy pozostałe są wymienione jako „OK”. nadal będziesz deklarować to jako „wprowadzające w błąd”, ale dokładnie tego oczekuję po sprawdzeniu CRC pliku zip pliku po pliku. teraz ... powodzenia panu.
Theophrastus,
Myślę, że na końcu zmieniłeś centralny katalog CRC. Spróbuj zmienić lokalny, przed lub po pliku.
Marc Rochkind,
12

Próba naprawienia archiwum spowoduje porównanie lokalnych i centralnych CRC, a połączenie tego z testami archiwalnymi pozwoli na sprawdzenie wszystkich CRC. Jeśli uciekniesz

unzip -t archive.zip

i

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

i nie narzekają, co oznacza, że ​​zawartość archiwum pasuje zarówno do centralnej, jak i lokalnej CRC. (Możesz archivefix.zippóźniej usunąć .)

Aby to sprawdzić, zaczynając od kodu źródłowego Info-ZIP dla zip3.0, utworzyłem plik w następujący sposób:

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

Następnie uszkodziłem CRC katalogu centralnego, zip.txtzmieniając bajt z przesunięciem 0xB137. Mam zachowanie przeciwne do tego, co zaobserwowałeś; unzip -vPodawane zmienionego CRC z katalogu centralnego, ale unzip -ti zip -Tpoinformował, że plik był OK (sprawdzanie przeciwko miejscowym CRC).

Ale działa

zip -F test --out testfix

zgłoszone

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

W „poprawionym” pliku nadal znajduje się zmieniony CRC zip.txt.

Zmiana lokalnego CRC zip.txtna przesunięcie 0x10 spowodowała oba unzip -ti zip -Tzgłosiła błąd CRC, ale zip -Fnie zauważyła nic złego.

Zatem z moich eksperymentów rozbieżności między zawartością wpisu archiwum a jego CRC można wykryć w następujący sposób:

  • tylko lokalnie: zip -Ti unzip -t; zip -Fbędzie również narzekać na niedopasowanie centralne na szczeblu lokalnym
  • lokalny i centralny: zip -Tiunzip -t
  • tylko centralne: zip -Ti unzip -tnie będzie narzekać, ale zip -Fwskaże niedopasowanie lokalne i centralne

(Zauważ, że domyślnie zip -Tpo prostu wykorzystuje unzip -tqq, tak zip -Ti unzip -tnaprawdę są równoważne można odczytać. unzipKod źródłowy, aby sprawdzić, testując archiwum naprawdę porównuje lokalny CRC, a nie jeden centralny; wygląd extract_or_test_files(), extract_or_test_entrylist()a extract_or_test_member()wszystko w extract.c.)

Stephen Kitt
źródło
Skomplikowane. I bez wątpienia bardzo zależy od tego, jakie wersje (GNU, BSD itp.). CRC jest tylko jedną z licznych kontroli integralności, które można wykonać.
Marc Rochkind,
1
Nie ma wielu wersji zipi unzipdostępnych na platformach typu Unix; Info-ZIP jest używany prawie wszędzie ...
Stephen Kitt
1
O ile jest to skomplikowane, wymaga tylko dwóch poleceń; jeśli oba unzip -ti zip -Furuchomić bez błędu, jesteś OK i oba CRC zostały sprawdzone.
Stephen Kitt,
Dzięki! Sprawdzę to. Zapomniałem też wspomnieć: pliki ZIP to ZIP64.
Marc Rochkind,