Unterschiedliche MD5-Summen für den gleichen Teergehalt

15

Ich führte einen Test durch, bei dem zwei Teere aus demselben Verzeichnis erstellt wurden (die Dateien blieben unverändert), und ich stellte fest, dass die MD5-Summen unterschiedlich waren. Ich nehme an, dass im Header des Tar ein Zeitstempel enthalten ist, aber ich habe keinen Weg gefunden, ihn zu überschreiben. Mein Betriebssystem ist Ubuntu 9.1. Irgendwelche Ideen ?

Vielen Dank.

xain
quelle
Zeigen Sie die von Ihnen verwendete tar-Befehlszeile an. Es sollte keinen Unterschied geben, es sei denn, die Dateien werden geändert. Selbst touch filenamewenn sich die Änderungszeit einer Datei ändert, reicht dies aus, um die Prüfsumme zu ändern.
Bis auf weiteres angehalten.
Hier ist der Befehl: tar czf one.tgz ./bin; tar czf two.tgz ./bin. Dann sind beide md5s unterschiedlich.
Xain
Es ist kein Teer selbst, es scheint gzip zu sein. Wenn Sie stattdessen j für bzip2 verwenden, erhalten Sie dieselbe md5sum. Es könnte ein Fehler sein - ich habe es auf Cygwin versucht und die gleiche Prüfsumme erhalten. (Ich habe auch Ubuntu 9.10 und habe dort unterschiedliche Ergebnisse erzielt, genau wie Sie.)
Bis auf weiteres angehalten.

Antworten:

13

Wie Dennis oben erwähnt hat, ist es GZIP. Ein Teil des gzip-Headers ist eine Mod-Zeit für alles, was in der Datei komprimiert ist. Wenn Sie gzip benötigen, können Sie die Tarfile als zusätzlichen Schritt außerhalb von tar komprimieren, anstatt das interne gzip von tar zu verwenden. Der Befehl gzip verfügt über ein Flag, um das Speichern dieser Änderungszeit zu unterdrücken.

tar -c ./bin |gzip -n >one.tgz
tar -c ./bin |gzip -n >two.tgz
md5sum one.tgz two.tgz

Dies wirkt sich nicht auf die Zeiten innerhalb der Tarfile aus, sondern nur auf die im GZIP-Header.

Jeff Snider
quelle
4
Es ist auch möglich, gzip-Optionen an tar likeGZIP=-n tar -cz ...
oseiskar 22.08.14
6

Um eine tar-Datei mit einer konsistenten Prüfsumme zu erstellen, müssen Sie nur Folgendes voranstellen GZIP=-n:

GZIP=-n tar -zcf myOutputTarball.tar /home/luke/directoryIWantToZip

So funktioniert das: Tar kann gzip-Optionen mit einer temporären GZIPUmgebungsvariablen wie oben akzeptieren . Wie Valter sagte, verwendet tar gzip, das standardmäßig einen Zeitstempel in das Archiv schreibt. Dies bedeutet, dass Sie eine andere Prüfsumme erhalten, wenn Sie dieselben Dateien komprimieren. Die -nOption deaktiviert diesen Zeitstempel.

Luke
quelle
4

Ich hatte auch dieses Problem, damit gzip den Zeitstempel nicht verändert, benutze gzip -n

-n, --no-name speichert den ursprünglichen Namen und den Zeitstempel nicht und stellt ihn nicht wieder her

[valter.silva@alog ~]$ gzip --help
Usage: gzip [OPTION]... [FILE]...
Compress or uncompress FILEs (by default, compress FILES in-place).

Mandatory arguments to long options are mandatory for short options too.

  -c, --stdout      write on standard output, keep original files unchanged
  -d, --decompress  decompress
  -f, --force       force overwrite of output file and compress links
  -h, --help        give this help
  -l, --list        list compressed file contents
  -L, --license     display software license
  -n, --no-name     do not save or restore the original name and time stamp
  -N, --name        save or restore the original name and time stamp
  -q, --quiet       suppress all warnings
  -r, --recursive   operate recursively on directories
  -S, --suffix=SUF  use suffix SUF on compressed files
  -t, --test        test compressed file integrity
  -v, --verbose     verbose mode
  -V, --version     display version number
  -1, --fast        compress faster
  -9, --best        compress better
    --rsyncable   Make rsync-friendly archive

With no FILE, or when FILE is -, read standard input.

Report bugs to <[email protected]>.

Beispiel:

[valter.silva@alog ~]$ ls
renewClaroMMSCanaisSemanal.log.gz  s3

[valter.silva@alog ~]$ gunzip renew.log.gz 
[valter.silva@alog ~]$ gunzip s3/renew.log.gz 

[valter.silva@alog ~]$ md5sum renew.log 
d41d8cd98f00b204e9800998ecf8427e  renew.log

[valter.silva@alog ~]$ md5sum s3/renew.log 
d41d8cd98f00b204e9800998ecf8427e  s3/renew.log

[valter.silva@alog ~]$ gzip -n renew.log 
[valter.silva@alog ~]$ gzip -n s3/renew.log 

[valter.silva@alog ~]$ md5sum renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  renew.log.gz

[valter.silva@alog ~]$ md5sum s3/renew.log.gz 
7029066c27ac6f5ef18d660d5741979a  s3/renew.log.gz
Valter Silva
quelle
0

Nachdem die anderen Antworten versagt hatten, bin ich in ein Kaninchenbaugebiet gefahren und habe herausgefunden, dass meine Version von tar (1.27.1 aus openSUSE 42.3 OSS repo) paxstandardmäßig das nicht deterministische Archivierungsformat verwendet, was sogar bedeutet Ohne Komprimierung (und sogar ohne explizite Einstellung der mtime) würden sich Archive, die mit tar aus denselben Dateien erstellt wurden, unterscheiden:

$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi

Beachten Sie, dass die Ausgabe oben unterschiedlich ist, obwohl keine Komprimierung verwendet wird . Die unkomprimierten Archivinhalte (die durch zweimaliges Ausführen von tar auf denselben Inhalten generiert werden) sind unterschiedlich, sodass sich die komprimierten Inhalte auch dann unterscheiden, wenn sie verwendet werden, GZIP=-nwie andere Antworten vermuten lassen

Um dies zu umgehen, können Sie Folgendes angeben --format gnu :

$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar  hartusershi

Dies funktioniert mit dem obigen Vorschlag zu gzip:

# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75  test.file.tgz

# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d  test.file.tgz

Zusätzlich zu den triftigen Gründen, bessere Komprimierungsformate gegenüber gzip zu bevorzugen , können Sie auch die Verwendung von xz in Betracht ziehen (was tar auch mit den Flags --xzoder -Janstelle von unterstützt -z), da Sie hier einen Schritt sparen. Das Standardverhalten von xzist, die gleiche komprimierte Ausgabe zu generieren, wenn die unkomprimierten Inhalte gleich sind. Es ist daher nicht erforderlich, eine Option wie die GZIP=-nfolgende anzugeben :

$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz 
dea99037d4b0ee4565b3639e93ac0930  test.file.txz
Hart Simha
quelle