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.


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 ]


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.)


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.