Führen Sie einen Unterschied zwischen lokalen und Remote-Dateien aus

39

Ich bin über auf einem Host verbunden sshund möchte diffeine bestimmte Konfigurationsdatei mit der entsprechenden Datei auf einem anderen Host vergleichen, auf die auch über zugegriffen werden kann ssh, ohne die Remote-Datei manuell herunterladen zu müssen, bevor das Diff ausgeführt wird.

fduff
quelle
Sie können das Remote-Verzeichnis mit bereitstellen SSHFSund dann darauf zugreifen, als wäre es lokal.
Barmar

Antworten:

57
ssh user@remote_host "cat remote_file.txt" | diff - local_file.txt

Quelle

Polym
quelle
1
Lädt die Pipe nicht einfach die Ergebnisse von herunter cat, bei denen es sich tatsächlich nur um die Originaldatei handelt?
Stijn de Witt
1
Die Pipe pusht das Ergebnis des Remote- sshBefehls zu dem Befehl, der darauf diffwartet, stdinmit der lokalen Datei verglichen zu werden.
Fduff
1
Vielleicht interpretiere ich die Anforderung "ohne das Herunterladen der Remote-Datei" falsch. Ich denke, OP bedeutet "ohne die Remote-Datei manuell herunterladen zu müssen". :) EDIT: Ah, du bist der OP. :)
Stijn de Witt
@StijndeWitt, ja, ich wollte vermeiden, zuerst die Remote-Datei scp und dann den
Unterschied zu
18

Versuchen:

diff local_file <(ssh user@server 'cat remote_file')

oder mit vimdiff:

vimdiff local_file scp://server//path/to/remote_file
cuonglm
quelle
Funktioniert das diff local_file <(ssh user@server 'cat remote_file')nur für passwortloses SSH? Es scheint nicht möglich zu sein, eine Passwortabfrage zu bekommen ...
sdbbs
1
@sdbbs: Die Prozessersetzung wurde im Hintergrund ausgeführt, und die Standardausgabe wird in die Named Pipe (oder anonyme Named Pipe) geschrieben, sodass Sie nicht zur Kennworteingabeaufforderung aufgefordert werden. Versuchen Sie cat <(ssh user@server 'cat remote_file')und cat < <(ssh user@server 'cat remote_file')die Unterschiede zu sehen.
Cuonglm
9

Vielleicht ist das in deinem Fall nicht hilfreich, aber ich benutze es oft einfach

sum -r

auf jedem Rechner und vergleichen Sie die Prüfsummen manuell. Dies ermöglicht den Vergleich von Dateien, auch wenn diese nicht über eine SSH-Verbindung erreichbar sind. Natürlich ist alles, was es antwortet, "sind sie identisch", aber oft reicht das für meine Bedürfnisse aus. Außerdem können Sie auf einfache Weise überprüfen, ob eine einzelne Datei auf drei oder vier oder mehr Computern identisch ist.

MJB
quelle
2
Ich kann mir vorstellen, dass dies für große Dateien oder langsame Verbindungen sehr nützlich sein könnte. Es speichert den Download der gesamten Datei, wenn die Dateien tatsächlich unterschiedlich sind. Ein besserer Bash-Scripter als ich kann diese Antwort wahrscheinlich mit den obigen Antworten kombinieren, bei denen eine Fernbedienung verwendet wird cat, um den catBefehl nur dann auszuführen, wenn festgestellt wurde, dass sich die Dateien unterscheiden.
Stijn de Witt
1
Das Kommando info coreutils 'sum invocation'sagt unter anderem: "'sum' ist aus Kompatibilitätsgründen vorgesehen; das Programm 'cksum' (siehe nächster Abschnitt) ist in neuen Anwendungen vorzuziehen."
Teemu Leisti
1

Wenn Sie in Ihrer Terminalsitzung einen visuelleren Ansatz bevorzugen. Der Midnight Commander verfügt über eine Remote-Dateisystemoption (Option SFTP-Link ... im Menü) und eine visuelle Dateivergleichsoption. Es wird auf den meisten Linux-Systemen nicht standardmäßig installiert, ist jedoch in den meisten Basis-Repositorys verfügbar. Schritte:

  1. Starten Sie den Mitternachtskommandanten (Befehl mc:) in dem Ordner, der die zu vergleichende Datei enthält
  2. Erstellen Sie auf der anderen Seite (z. B. im Menü Rechts ) einen SFTP-Link zum anderen Server im selben Ordner ( sftp://<user>@<servername>/<path>).
  3. Mit der insTaste die zu vergleichenden Dateien auswählen / markieren. ( tabwechselt zwischen linkem und rechtem Panel).
  4. Im Befehlsmenü wählen Sie Dateien vergleichen

Hinweis: Das Mitternachtsmenü kann normalerweise mit der Maus in Ihrer Terminalsitzung aufgerufen werden. Das, was nicht funktioniert, F9bringt Sie auch ins Menü.

Fholst
quelle