Ich habe ein Linux-Basissystem installiert. Ich möchte ein sehr großes und komplexes Skript von Drittanbietern ausführen, das viele Änderungen an verschiedenen Teilen des gesamten Systems vornimmt. Diese Änderungen umfassen das Hinzufügen neuer Dateien, das Ändern vorhandener Dateien und das Entfernen vorhandener Dateien. Sobald das Skript fertig ist, werde ich ein modifiziertes System haben. Die Änderungen werden umfassend und erheblich sein.
Ich möchte eine Art Bericht über alle Dateien, die hinzugefügt, entfernt oder geändert wurden, und eine zeilenweise Analyse der Änderungen. So etwas wie die Ausgabe eines Datei-Diff-Tools wäre großartig.
Ich gehe davon aus, dass ich vor dem Ausführen des Skripts eine Art Schnappschuss erstellen muss und danach einen zweiten Schnappschuss. Ich gehe dann davon aus, dass ich diese Schnappschüsse in eine Art Diff oder Diff-ähnliches Tool einspeisen würde.
Weiß jemand, welche Tools zu verwenden sind und wie ein gesamtes System unterschieden werden kann?
Ich verwende Virtualbox mit einer Funktion zum Differenzieren von Bildern , obwohl ich nicht weiß, ob ich sie an diesen Zweck anpassen kann. Außerdem würde ich nach Möglichkeit eine allgemeinere Lösung bevorzugen.
rsync
einen Snapshot erstellen und nach den Änderungen einen weiteren Lauf ausführen, um einen Bericht über geänderte Dateien zu erstellen. Der unterschiedliche Teil wäre wahrscheinlich schwieriger.Antworten:
Ich denke, Ihre Idee ist nicht weit von einer Lösung entfernt. Um einen möglichen Weg zu skizzieren: Ich verwende
rsnapshot
für Backups. Es erstellt eine Verzeichnisstruktur (Backup-) aller oder einer Teilmenge Ihrer Dateien mit Einstiegspunkten von (z. B.)/backup/hourly.1/...
und/backup/hourly.0/...
, wobei jeder Zweig die gesamten Daten enthält, verwendet jedoch (Hard-) Links für Dateien, bei denen keine Änderungen vorgenommen wurden . Wenn Sie eine rekursivels
oderfind
beide Strukturen ausführen und die (sortierte, im Falle einer Suche) Ausgabe vergleichen, werden die fehlenden Dateien angezeigt, undls -l
wenn Sie die Anzahl der Links überprüfen (in der zweiten Spalte wäre dies), werden neue Dateien angezeigt (die eine Anzahl der Links haben) 1). Für Details zu Änderungen in den Dateien können Sie (für die identifizierten Dateien) normal verwendendiff
Werkzeuge. Wie gesagt, dies ist eine Übersicht, die einige Arbeit erfordert, um sie umzusetzen, und möglicherweise nicht offensichtliche Macken aufweist. Nehmen Sie diesen Vorschlag also mit einem Körnchen Salzquelle
Ich würde dies wahrscheinlich mit rsync tun, wie in einem der Kommentare vorgeschlagen. Rsync verfügt über einen Trockenlaufmodus und eine Prüfsummenfunktion, mit der Sie einen genauen Bericht über die Änderungen erstellen können.
Wenn Sie weiter gehen, könnten Sie vielleicht ein Skript schreiben, das einen Unterschied bei geänderten Dateien ausführt, obwohl Sie dafür sorgen müssten, dass Binärdateien vermieden werden (nicht sicher, wie).
Oder Sie könnten einen ganz anderen Ansatz wählen. Verwenden Sie git. Führen Sie also auf Ihrem 'Basissystem' einen Git-Init in / aus, und nachdem Sie das Drittanbieter-Ding ausgeführt haben, können Sie einfach Folgendes tun:
Die Verwendung von Git würde Ihnen einiges an Flexibilität geben. Allerdings kann es um ein ganzes System kämpfen und über / proc etc verwirrt werden.
quelle
Es gibt etwas namens libguestfs, mit dem Sie den Diff ausführen können. Das habe ich in der Vergangenheit verwendet und ich denke jetzt, dass die Operation möglicherweise sogar eingebaut ist, sodass Sie die Guestfish-Shell nicht verwenden müssen.
Eine andere Möglichkeit besteht darin, Ihre Vorgänge in einem Docker-Container auszuführen und die resultierenden Dateibäume dann als TAR-Dateien zu exportieren und zu unterscheiden.
Beachten Sie jedoch, dass wenn das Skript die Systemeinstellungen durch Schreiben in virtuelle Dateien ändert, diese Änderungen nicht im Dateibaum angezeigt werden und Sie etwas anderes benötigen, um diese Änderungen zu erfassen. Ein Beispiel für so etwas sind iptable Regeln. Sie benötigen eine benutzerdefinierte Logik, um diese Änderungen zu erfassen.
quelle
Die Seite im Linux-Kochbuch zeigt ein find-grep vor und nach der Änderung, gefolgt von einem Unterschied. Es ist sehr einfach, es könnte ein Ausgangspunkt sein, aber Ihr Problem könnte besser mit den ausgefeilteren Lösungen angegangen werden.
Dies sieht so aus, als würde es nur Ergänzungen und Löschungen erfassen, keine Änderungen ... Prost, drl
quelle
Alle diese Antworten gehen in die richtige Richtung und auf die gleiche Weise. Kann auch meine 8 Bits in ...
Installieren Sie das Basissystem auf der Virtualbox. Starten Sie die VM nach der Ersteinrichtung und wenn Ihre Basis bereit ist, mit einem anderen Live-Medium. Sie können das Dateisystem dann tarieren oder auf andere Weise exportieren, ohne dass die flüchtigen Verzeichnisse
/proc
beteiligt sind.Führen Sie Ihr umfangreiches Skript aus und wiederholen Sie den Exportvorgang.
Jetzt haben Sie die 2 Dateisysteme zur Verfügung, Sie können verschiedene Vergleichstools verwenden.
diff --brief -Nr /tree1 /tree2
Sie erhalten eine schöne Liste von Dateien, die sich unterscheiden
stdout
, und eine Liste von Dateien, die in dem einen oder anderen Baum nicht gefunden werdenstderr
.Um herauszufinden, welche tatsächlichen Änderungen vorgenommen wurden, können Sie die
stdout
Ausgabe von Dateien, die sich unterscheiden , analysieren und regelmäßigdiff
einzeln ausführen , um die Ausgabe in eine Datei umzuleiten. Oder Sie können einfach die Liste untersuchen und diff für die Dateien ausführen, die Sie besonders interessieren.Sie können all dies mit einem Befehl kombinieren
git
. Kann verwendet werden, ohne dass ein Repo initialisiert wird. Zeigen Sie einfach auf 2 beliebige Verzeichnisse. Gibt eine schöne farbige Ausgabe, paginiert durch weniger.git diff --no-index /tree1 /tree2
quelle