CentOS 5.x.
Mq Frage schien ähnlich diesen , aber ich war nicht sicher , ...
Ich habe zwei Server (vollständig voneinander isoliert), jeder mit einem Verzeichnis und Unterverzeichnissen, die genau den gleichen Inhalt haben sollten.
Das Verzeichnislayout könnte beispielsweise so aussehen:
SERVER A -
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
SERVER B -
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
Idealerweise möchte ich eine Möglichkeit haben, eine rekursive Prüfung durchzuführen und etwas bestätigen zu lassen, dass alles übereinstimmt.
Ich möchte auch die Verwendung von Tools von Drittanbietern vermeiden.
Irgendwelche Ideen?
rsync
? Also ... ähm, verwendenrsync
(mit-n
Option)?Antworten:
Eine gute Möglichkeit besteht darin, md5sums für jede Datei im Baum zu verwenden:
Führen Sie dies auf Server1 aus:
Führen Sie dies auf Server2 aus
Dann vergleichen Sie einfach die beiden Dateien (mit diff) oder was auch immer Sie möchten.
Entspricht das dem, wonach Sie suchen?
Natürlich können Sie SSH verwenden, um den Befehl nur remote auszuführen, wenn Sie möchten.
quelle
ssh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Wenn Sie sich nicht unbedingt darum kümmern, was sich geändert hat, sondern nur, dass sich etwas geändert hat, ist rsync immer noch sehr gut dafür. Versuchen Sie, diesen Befehl auszuführen, und werfen Sie einen Blick auf die Ausgabe, vorausgesetzt, dies wird von 'servera' ausgeführt.
Die resultierende Liste enthält die Dateien, die geändert worden wären, wenn Sie den Synchronisierungsprozess tatsächlich ausgeführt hätten. Beachten Sie, dass die Dateien in der Liste angezeigt werden, auch wenn sich nur der Zeitstempel geändert hat, der Inhalt jedoch gleich geblieben ist. Da wir das
-n
Flag hinzugefügt haben , werden tatsächlich keine Aktionen ausgeführt, sondern nur gemeldet.quelle
rsync
. Um jedoch völlig korrekt zu sein, müssen Sie dasrsync
in beide Richtungen ausführen . Das heißt, Sie müssen Folgendes hinzufügen:rsync -avcn serverb:/opt/foo/ /opt/foo
Während Sie ein schnelles Skript zusammenhacken könnten, das einzelne MD5-Hashes für einzelne Dateien in einem Verzeichnis berechnet, wäre es besser, ein Tool namens zu verwenden,
md5deep
das die Hashes aller Dateien in einem Verzeichnis rekursiv berechnet und dann ausgibt sie in eine Datei. Es kann dann in einem anderen Verzeichnis verwendet werden, wobei die erste Hash-Datei als Eingabe verwendet wird und Sie eine Liste der Dateien erhalten, die sich zwischen den beiden Verzeichnissen unterscheiden.Nehmen Sie also Ihr Beispiel und folgen Sie diesem Prozess:
Berechnen Sie Hashes des erforderlichen Verzeichnisses auf Server A:
md5deep -r /opt/foo/ > file_hashes.txt
Kopieren Sie die Datei
file_hashes.txt
zum Vergleich auf Server B.Berechnen Sie die Hashes des erforderlichen Verzeichnisses auf Server B, verwenden Sie jedoch die Datei-Hashes von Server A als Eingabedatei, indem Sie das
-x
Flag verwenden, um nur Dateien anzuzeigen, die sich unterscheiden:md5deep -x file_hashes.txt -r /opt/foo/
Die md5deep-Tools sind Teil des Paketverwaltungssystems der meisten Distributionen, und das Tolle ist, dass sie eine Reihe verschiedener Hashing-Algorithmen unterstützen, nicht nur MD5. Wenn Sie also in Bezug auf Kollisionen paranoid sind, stehen Ihnen eine Reihe von Alternativen zur Verfügung. Die folgenden Tools sind Teil von md5deep und bieten jeweils einen alternativen Hashing-Algorithmus:
quelle
Ich habe eine ähnliche Technik wie @ scott-pack verwendet. Dies zeigt, dass Sie sich in beide Richtungen unterscheiden können. Alles, was mit "Löschen" beginnt, ist eine Datei, die sich auf dem Remote-Server befindet, nicht jedoch auf dem lokalen Server. Jedes Verzeichnis, das ohne Dateiinhalt aufgeführt ist, hat keine Änderungen. Jede aufgelistete Datei ist eine Datei, die entweder nicht auf dem Remote-Server vorhanden ist oder deren lokale Version "neuer" ist.
quelle