Im Zusammenhang mit Backups stellt sich oft die Frage, ob am Ziel auch die Dateien bzw. ihre Inhalte ankamen, wie sie sollten, um Problemquellen wie vergessene Verzeichnisse oder (noch fieser) vergessene hidden files aufzuspüren. Im Grunde geht es um einen simplen Integritätsschutz, der sich allerdings oft lediglich auf die Inhalte bezieht und gerade nicht auf Metadaten wie Rechte oder Change Time.
In diesem Zusammenhang in der Serie „StackOverflow-Frage der Woche“: How do I get the MD5 sum of a directory's contents as one sum?
Allerdings denken wir uns mal ganz schnell MD5 in dem Zusammenhang weg, da diese Hashfunktion bereits (theoretisch) angreifbar ist. Ich habe es gegen SHA512 ausgetauscht.
Inhalte vergleichen
Für Linux lässt sich in dem Zusammenhang folgendes Kommando verwenden:
find somedir -type f -exec sha512sum {} \; | sort -k 2 | sha512sum
Man sieht, dass diese Variante mit den coreutils auskommt und die Ergebnisse nur an das Checksum-Programm übergibt. Es werden alle Inhalte der Dateien gehasht und diese Hashes samt Dateinamen wiederum gehasht. Wegen letzterem sollte übrigens auch drauf geachtet werden, das Programm möglichst relativ zum Verzeichnis zu starten, damit in der Checksum-Liste Dateinamen wie "somedir/foo" statt "/home/user/somedir/foo" stehen. Diese Angaben beeinflussen nämlich auch den Gesamthash der Ausgabe und führen zu unterschiedlichen Hashes, wenn der absolute Pfad der zu vergleichenden Verzeichnisse unterschiedlich ist und/oder das Kommando von unterschiedlichen Stellen aufgerufen wurde.
Der Umweg über sort
wird übrigens gewählt, damit die Hashliste der Dateien nicht zufällig, sondern deterministisch, ausgegeben wird, da – man kann es sich denken – auch das wieder den Gesamthash beeinflusst.
Da BSD find
die reproduzierbare Auflistung von Haus aus beherrscht, ist der Weg dort sogar noch eleganter:
find -s somedir -type f -exec sha512sum {} \; | sha512sum
Dateien samt Metadaten vergleichen
Abschließend ist es natürlich auch möglich, die Metadaten miteinzubeziehen, wenn auf z.B. tar
zurückgegriffen wird:
tar -cf - somedir | sha512sum
Quelle: Young, Warren. How do I get the MD5 sum of a directory's contents as one sum?. 2012. StackExchange. CC BY-SA