ZIP dosyasının bütünlüğü test edildi mi?


21

Zip'i söyleyebileceğim gibi -T seçeneği yalnızca dosyaların çıkartılıp çıkartılamayacağını belirler - bu, arşivi iç bütünlük açısından test etmez. Örneğin, yerel (merkezi dizin değil) CRC’yi bir dosya için kasıtlı olarak bozdum ve zip önemli değil, arşivi OK olarak bildirdim. Bunu yapmak için başka bir yardımcı program var mı?

ZIP dosyalarında çok fazla dahili artıklık var ve hepsini kontrol etmenin bir yolu olması iyi olurdu. Elbette, normalde merkezi dizin ihtiyacınız olan tek şeydir, ancak bozuk bir arşivi tamir ederken genellikle sahip olduğunuz tek şey, merkezi dizin gizlenmiş ya da eksik olan bir parçadır. Oluşturduğum arşivlerin mümkün olduğunca kurtarılabilir olup olmadığını bilmek istiyorum.


2
Ne hakkında unzip -t?
FloHimself

Zip ile aynı davranış.
Marc Rochkind

Yanıtlar:


20

-t aç

Arşiv dosyalarını test edin.

Bu seçenek, belirtilen her bir dosyayı bellekte ayıklar ve genişletilmiş dosyanın CRC'sini (döngüsel artıklık denetimi, genişletilmiş bir sağlama toplamı) orijinalin kayıtlı CRC değeriyle karşılaştırır.

[kaynak: https://linux.die.net/man/1/unzip ]


Dosya başına 2 CRC vardır: yerel ve merkezi. unzip -tsadece ikincisini test eder.
Marc Rochkind

2
"merkezi" yerine "merkezi" (ne ile merkezi?) derken ne demek istediğinizi bilmiyorum ama "unzip -t myzip_file.zip" komutunu çalıştırdığımda, her sıkıştırılmış dosyanın bütünlüğü hakkında yorum yapmak için bir satır çıktısı görüyorum , gibi (daha iyi biçimlendirme hayal edin): "test: AARiseTransitSet.cpp Tamam test: AARiseTransitSet.h Tamam test: AASaturn.cpp Tamam test: AASaturn.h Tamam ...
Theophrastus

ZIP dosyalarının iç yapısını açıklayacak yer değil. Wikepedia makalesi bu konuda oldukça iyi. Dediğim gibi, gördüğünüz yanıltıcı bir rapor.
Marc Rochkind

Onaltılık düzenleyicili bir zip dosyasına girip bir bayt değiştirirsem, bir dosya için bakarım: test: AA_sphere.htm bad CRC 7952862e (44c6f7f8 olmalı), gerisi "Tamam" olarak listeleniyor. Bunu "yanıltıcı" olarak ilan etmeye devam edersiniz, ancak bu tam olarak bir zip dosyası için dosya-dosya CRC kontrolü için beklediğim şeydir. şimdi ... size iyi şanslar efendim.
Theophrastus

Sanırım sonunda CRC'nin ana dizinini değiştirdiniz. Yerel olanı dosyadan önce veya sonra değiştirmeyi deneyin.
Marc Rochkind

12

Bir arşivi onarmaya çalışmak, yerel ve merkezi CRC'leri karşılaştıracak ve bunu arşiv testleriyle birleştirmek tüm CRC'lerin kontrol edilmesini sağlayacaktır. Eğer koşarsan

unzip -t archive.zip

ve

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

ve hiçbiri şikayet etmiyor, bu da arşiv içeriğinin hem merkezi hem de yerel CRC'lerle eşleştiği anlamına geliyor. (Daha archivefix.zipsonra silebilirsiniz .)

Bunu doğrulamak için zip3.0 için Info-ZIP kaynak kodundan başlayarak aşağıdaki gibi bir dosya oluşturdum:

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

Daha sonra zip.txtofset 0xB137'deki byte'ı değiştirerek CRC'nin merkezi dizinini bozdum. Gözlemlediğinin tam tersi davranışta bulundum; unzip -vmerkez dizinden değişmiş CRC bildirdi, ancak unzip -tve zip -Tdosya Tamam (yerel CRC karşı kontrol) olduğunu bildirmiştir.

Ama koşuyor

zip -F test --out testfix

rapor

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

"Düzeltilen" dosya hala değiştirilmiş CRC'yi listeledi zip.txt.

Yerel CRC değiştirilmesi zip.txtofset 0x10 hem sebep unzip -tve zip -Tbir CRC hata bildirmek, ancak zip -Fhiçbir şey yanlış nokta yoktu.

Bu yüzden deneylerime göre, bir arşiv girişinin içeriği ile CRC'leri arasındaki uyumsuzluklar aşağıdaki gibi algılanabilir:

  • sadece yerel: zip -Tve unzip -t; zip -Fyerel-merkezi uyumsuzluktan da şikayet edecek
  • yerel ve merkezi: zip -Tveunzip -t
  • yalnızca merkezi: zip -Tve unzip -tşikayet etmeyecek, ancak zip -Fyerel-merkezi bir uyumsuzluğu gösterecek

(Not Varsayılan Bununla zip -Tbasitçe kullanır unzip -tqqböylece, zip -Tve unzip -tgerçekten eşdeğerdir Okuyabiliyorsun. unzipBir arşivi test gerçekten yerel CRC değil, merkezi bir karşılaştırır olmadığını kontrol için kaynak kodunu; yönelik bakış extract_or_test_files(), extract_or_test_entrylist()ve extract_or_test_member(), tüm extract.c.)


Karmaşık. Ve hiç şüphesiz, hangi sürümlere (GNU, BSD, vb.) Çok bağımlıdır. CRC, gerçekleştirilebilecek çok sayıdaki bütünlük kontrolünden yalnızca biridir.
Marc Rochkind

1
Değil birçok versiyonu vardır zipve unzipgeçerli Unix benzeri platformlar; Info-ZIP hemen hemen her yerde kullanılıyor ...
Stephen Kitt

1
Karmaşık olduğu sürece, sadece iki komut alır; her ikisi de unzip -tve zip -Fhatasız çalışırsanız, Tamamsınız ve her iki CRC de kontrol edildi.
Stephen Kitt

Teşekkürler! Bunu kontrol edecek. Ayrıca, söylemeyi unuttum: ZIP dosyaları ZIP64'dür.
Marc Rochkind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.