Frage Wie verhält sich diff über ssh?


Wie teile ich Dateien / Ordner über Rechner hinweg, vorausgesetzt, dass die einzige verfügbare Verbindung ssh ist?


166
2017-08-26 17:17


Ursprung


Da ist eine relativ ähnliche Frage # 16661: Wie kann ich zwei RedHat Linux Server unterscheiden?. Die Antwort dort, um die Klicks zu speichern, ist rsync -ani --delete / root@remotehost:/ aber die vollständige Antwort gibt mehr Details. - Owen Blacker
Ziemlich viele Antworten hier, aber welcher Ansatz ist der schnellere? - pl1nk
Niemand benutzt visuelle Diff-Tools? - Dan Dascalescu


Antworten:


Du kannst es mit Bashs machen Prozesssubstitution:

 diff foo <(ssh myServer 'cat foo')

Oder, wenn beide auf Remote-Servern sind:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')

142
2017-08-26 17:22



Ja, so etwas, aber für Verzeichnisse :) - Alexey Timanovsky
Wie meinst du das für Verzeichnisse, könnte cat immer durch ls ersetzen - Kyle Brandt♦
Ich vermute, dass "für Verzeichnisse" ein rekursives diff bedeutet - Ian Clelland
Ich fand, dass diese Technik für mich nicht funktionierte, wenn mein Remote-Host ein Passwort benötigte. Die Aufforderung zur Kennworteingabe schien mit der Umleitung nicht gut zu funktionieren und konnte nicht erfolgreich abgeschlossen werden. Wenn Sie ssh-Schlüssel verwenden, sollte dies kein Problem sein. - Adam Franco
Dies ist eine großartige allgemeine Lösung für viele Probleme. Statt 'cat foo' könnten Sie 'find / foo / bar -type f | während Datei lesen; echo "**** $ file"; Katze "$ Datei"; done 'und Sie haben eine Liste der Dateinamen und Dateiinhalte zu diff. - Paul Gear


Endlich habe ich eine großartige Lösung gefunden: vimdiff

vimdiff /path/to/file scp://remotehost//path/to/file

Dank an http://linux.spiney.org/remote_diff_with_vim_and_ssh siehe auch http://www.vim.org/scripts/script.php?script_id=1075 .


98
2018-05-15 08:55



Vimdiff ist süß, danke! - Max Felker
Was ist mit Verzeichnissen? :) - Perlnika
Hier ein Beispiel: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile - vaichidrewar
2 Schrägstriche // nach dem remotehost ist wichtig. Ein einzelner Schrägstrich funktioniert nicht - Lee Chee Kiam
Wenn Sie auf dem Remote-Host einen anderen Benutzernamen als Ihren aktuellen Host haben, würden Sie verwenden vimdiff /path/to/file scp://username@remotehost//path/to/file - JaredC


Wenn Sie nur sehen möchten, welche Dateien anders sind, als ein Unterschied der tatsächlichen Dateien, dann können Sie verwenden rsync --dry-run


58
2017-09-04 11:14



rsync -n ist die Kurzversion. - volni
Großartig - wenn Sie einen anderen Port verwenden müssen, verwenden Sie rsync -e "ssh -p 2222" <SRC> <DST> - Samoth


Hier ist ein weiteres schnelles und schmutziges Befehlszeilenrezept. Im Gegensatz zur gewählten Antwort funktioniert es innerhalb von Makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"

15
2017-12-27 18:43



Wenn meine Bearbeitung nicht durchgeht: Diese Methode ist der gewählten Antwort überlegen, weil sie mit Makefiles funktioniert. - Chris Redford
@Steve Dickinson - was meinst du mit "es funktioniert innerhalb von Makefiles"? - Martin Vegter
Dies ist auch eine gute Lösung, wenn Sie an einer Vimallergie wie ich leiden. :) Ich habe ein Bash-Skript erstellt, das die gleiche Datei auf zwei verschiedenen Hosts vergleicht, was beim Migrieren von Diensten zwischen Maschinen und Vergleichen von Konfigurationsdateien nützlich ist. Sehen gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff - Janek


Verwenden Sie scp, um die Dateien auf einen gemeinsamen Rechner zu bringen und dort zu verbreiten?

Oder, wenn Sie nur wissen wollen, ob die Dateien sind anders oder nicht, hash sie mit md5sum auf jeder Maschine.

Sie könnten auch in etwas wie aussehen SSHFS, aber ich weiß nicht, wie gut ein Algorithmus wie diff darüber funktioniert.


10
2017-08-26 17:19



Eine einfachere Möglichkeit zu sehen, ob die Dateien unterschiedlich sind oder nicht, ist rsync --dry-run. - Gerald Combs
Ich hatte SSHFS vergessen. Das hat super für mich funktioniert ... - arod


Eine Möglichkeit, wenn es auf Ihrem System möglich wäre, einfach das Remote-Dateisystem mit mounten zu müssen sshfs.


7
2017-08-26 17:19



diff ist in der Regel eine einmalige Aktion, um Config-Unterschiede zu überprüfen. Das Dateisystem jedes Mal zu mounten ist möglich, aber nicht praktisch. Ich würde besser tar und scp. - Alexey Timanovsky


Sie können verwenden rsync im Trockenlaufmodus, wie kurz in. vorgeschlagen eine andere Antwort. Es listet alle Dateien auf, die unterschiedlich sind.

Verwenden Sie dazu das rvnc Optionen (r= rekursiv, v= ausführlich, n= Trockenlauf, c= Prüfsumme). Mit rsync im Pull-Modus (rsync [OPTION...] [USER@]HOST:SRC... [DEST]), ein Beispiel ist:

rsync -rvnc root@182.18.158.207:/var/www/html/dev/ .

MerkenDies liefert keine Informationen darüber, ob die lokale oder Remote-Datei neuer ist. Nur wenn sie sich unterscheiden.


3
2018-04-29 12:21





  • Erstellen Sie auf Ihrem lokalen Computer eine rekursive Kopie des Verzeichnisses, das Sie differentieren möchten. Zum Beispiel:

    cp -R dir replica
    
  • Verwenden Sie rsync, um das Remote-Verzeichnis über die lokale Kopie zu replizieren:

     rsync remote:/path/to/dir replica
    
  • Verwenden Sie diff, um den Unterschied zwischen dem lokalen Verzeichnis und dem lokalen Replikat des entfernten Verzeichnisses zu finden:

    diff dir replica
    

2
2018-01-30 13:16