63 Stimmen

Wie man Verzeichnisse über ssh vergleicht

Ich versuche, ein Verzeichnis auf dem lokalen Host mit einem Verzeichnis auf einer entfernten Linux-Maschine rekursiv zu vergleichen. Wenn ich jedoch den nächsten Befehl ausführe:

diff -r 'ssh admin@10.0.0.10:/home/admin' /home/admin

funktioniert es nicht und sagt:

diff: ssh admin@10.0.0.10:/home/admin: Datei oder Verzeichnis nicht gefunden

Was ist der richtige Weg, um rekursiv den Inhalt der Verzeichnisse zu vergleichen?

Vielen Dank im Voraus

54voto

BMW Punkte 38430

Wenn Sie nicht die Details in der Datei vergleichen müssen, erhalten Sie einfach den Unterschied zwischen dem Verzeichnis-/Dateinamen, dann versuchen Sie dies:

(Hinweis: Sie müssen "SSH-Login ohne Passwort" einstellen, für Details beachten Sie diese URL: http://www.linuxproblem.org/art_9.html)

diff <(ssh admin@10.0.0.10 ls -R /home/admin) <(ls -R /home/admin)

38voto

Mark Setchell Punkte 167079

Versuchen Sie es mit "rsync" und der Option "-n", die nur eine "Trockenübung" durchführt und Ihnen sagt, was es tun würde.

17voto

Alfe Punkte 51658

Sie können das Remote-Verzeichnis über sshfs mounten, dann können Sie diff -r verwenden, um die beiden Verzeichnisse zu vergleichen, wie Sie es möchten.

Alternativ könnten Sie ähnliche find Befehle auf beiden Maschinen ausführen, um die Dateibaumstruktur (z. B. Dateinamen, Größen und Datum) auszudrucken und dann die Ausgaben beider mit diff vergleichen. Dies würde natürlich keine Dateiinhalte vergleichen:

diff <(ssh host find /home/admin -printf '"%8s %P\n"') \
     <(find /home/admin -printf '%8s %P\n')

Beachten Sie das doppelte Anführungszeichen der printf-Formatzeichenkette im ssh Aufruf. Eine Schicht wird vom ssh Relay entfernt.

3voto

Martin H. Punkte 105

Aufbauend auf der Antwort von @MarkSetchell und der darunter liegenden Diskussion:

Wenn Sie rsync für den Unterschied verwenden möchten, hier ist ein Beispiel:

rsync --itemize-changes --dry-run --delete --links -r -c downloads/ user@192.168.1.2:/home/user/downloads/

0voto

MhagnumDw Punkte 833

Für alle folgenden Beispiele sind leere Ordner irrelevant.

Wenn das Passwort für ssh nicht erforderlich ist und Sie die Dateien anzeigen möchten

diff -y -W250 \
  <(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")
  <(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")

Wenn das Passwort für ssh nicht erforderlich ist und Sie nur wissen möchten, ob die Ordner gleich sind

diff -y -W250 \
  <(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

Wenn das Passwort für ssh erforderlich ist

  • Installieren Sie das Paket sshpass
  • Empfangen Sie Ihr Passwort sicher in der PASS-Variablen (das Passwort wird in 60 Sekunden gelöscht): echo -n "Passwort: "; IFS= read -rs PASS < /dev/tty; trap 'unset PASS; echo "PASS wurde gelöscht"; trap - USR1' USR1; { sleep 60; kill -USR1 $$; } &

Also...

diff -y -W250 \
  <(sshpass -p "$PASS" ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(sshpass -p "$PASS" ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

Wenn sudo auf dem Remote-Host benötigt wird

diff -y -W250 \
  <(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
  <(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")

Und Sie können die Optionen zusammenführen.

Ich empfehle icdiff anstelle von diff, aber diff ist ausreichend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X