Wie unterscheidet man sich von ssh?

175

Wie kann ich Dateien / Ordner zwischen Computern unterscheiden, vorausgesetzt, die einzige verfügbare Konnektivität ist ssh?

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

Antworten:

150

Sie können dies mit der Prozessersetzung von Bash tun :

 diff foo <(ssh myServer 'cat foo')

Oder, wenn sich beide auf Remote-Servern befinden:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
Kyle Brandt
quelle
12
Ja, so etwas, aber für Verzeichnisse :)
Alexey Timanovsky
Wie meinst du für Verzeichnisse, könnte immer Katze mit ls ersetzen
Kyle Brandt
27
Ich vermute, dass "für Verzeichnisse" bedeutet, einen rekursiven Diff zu machen
Ian Clelland
9
Ich stellte fest, dass diese Technik bei mir nicht funktionierte, wenn mein Remote-Host ein Passwort benötigte. Die Kennwortabfrage 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
2
Dies ist eine großartige allgemeine Lösung für viele Probleme. Anstelle von 'cat foo' kann auch 'find / foo / bar -type f | während die Datei gelesen wird; mache ein Echo "**** $ file"; cat "$ file"; getan 'und Sie hätten eine Liste der Dateinamen und Dateiinhalte zu unterscheiden.
Paul Gear
106

Endlich habe ich eine tolle Lösung gefunden: vimdiff

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

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

Alexey Timanovsky
quelle
7
Was ist mit Verzeichnissen? :)
Perlnika
1
Hier ist ein Beispiel: vimdiff .bash_profile scp: //[email protected]//home/vaibhavc/.bash_profile
vaichidrewar
4
2 Schrägstriche //nach dem remotehostist wichtig. Einzelne Schrägstrich wird nicht funktionieren
Lee Chee Kiam
2
Wenn Sie auf dem Remote-Host einen anderen Benutzernamen haben als auf Ihrem aktuellen Host, würden Sievimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC
Wie können Sie dies mit zwei Remote-Hosts mit id_rsa Schlüsseldateien @JaredC tun?
Manatax,
61

Wenn Sie nur sehen möchten, welche Dateien sich unterscheiden, anstatt sich von den tatsächlichen Dateien zu unterscheiden, können Sie sie verwenden rsync --dry-run

Rory
quelle
10
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
16

Hier ist ein weiteres schnelles und schmutziges Befehlszeilenrezept. Anders als die gewählte Antwort funktioniert es in Makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"
Steve Dickinson
quelle
Wenn meine Bearbeitung nicht funktioniert: Diese Methode ist der gewählten Antwort überlegen, da sie mit Makefiles funktioniert.
Chris Redford
@ Steve Dickinson - was meinst du mit "es funktioniert innerhalb von Makefiles"?
Martin Vegter
1
Dies ist auch eine gute Lösung, wenn Sie wie ich an einer Vim-Allergie leiden. :) Ich habe ein Bash-Skript erstellt, das dieselbe Datei auf zwei verschiedenen Hosts vergleicht. Dies ist nützlich, wenn Dienste zwischen Computern migriert und Konfigurationsdateien verglichen werden. Siehe gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek
10

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

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

Sie könnten auch so etwas wie SSHFS untersuchen , aber ich weiß nicht, wie gut ein Algorithmus wie diff darüber abschneidet.

Ian Clelland
quelle
2
Eine einfachere Möglichkeit, um festzustellen, ob die Dateien unterschiedlich sind oder nicht, ist rsync --dry-run.
Gerald Combs
Ich hatte SSHFS vergessen. Das hat bei mir großartig funktioniert ...
arod
7

Eine Möglichkeit, wenn es auf Ihrem System möglich ist, besteht darin, das entfernte Dateisystem einfach mit sshfs einzuhängen .

Zoredache
quelle
diff ist normalerweise eine einmalige Aktion, um Konfigurationsunterschiede zu überprüfen. Das Mounten des Dateisystems ist jedes Mal möglich, aber nicht praktisch. Ich würde besser Teer und Scp.
Alexey Timanovsky
3

Sie können den rsyncTrockenlaufmodus verwenden, wie in einer anderen Antwort kurz vorgeschlagen . Es werden alle Dateien aufgelistet, die unterschiedlich sind.

Verwenden Sie dazu die rvncOptionen ( r= rekursiv, v= ausführlich, n= Probelauf, c= Prüfsumme). Im rsyncPull-Modus ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]) ist ein Beispiel:

rsync -rvnc [email protected]:/var/www/html/dev/ .

Denken Sie daran , dass dies keine Informationen darüber liefert, ob die lokale oder die entfernte Datei neuer ist. Nur wenn sie sich unterscheiden.

zzapper
quelle
2
  • Erstellen Sie auf Ihrem lokalen Computer eine rekursive Kopie des Verzeichnisses, das Sie unterscheiden 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 Remote-Verzeichnisses zu ermitteln:

    diff dir replica
    
salva
quelle
2

Wenn Sie sshfs haben und Verzeichnisse unterscheiden müssen:

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path
metrix
quelle
1

Hier ist, wie ich es gemacht habe.

Ich habe SFTP für den Remote-Server verwendet und bei Aufforderung meinen Benutzernamen / pwd eingegeben. Dann habe ich das Verzeichnis verwendet, das im Verzeichnis .gvfs in meinem Ausgangsverzeichnis im Befehl diff erstellt wurde.

diff -r --brief / home / benutzer dir / .gvfs / SFTP \ on \ freenas.local / pfad zu dir / dir1 / pfad zu lokalem dir / dir2

Peter
quelle
1

Dies ist ein Skript, mit dessen Hilfe lokale Ordner und Remote-Ordner unterschieden werden können:

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh [email protected] 'ls -lA /hfs/tee'| grep -E '^total' | cut -d " " -f 2 > remotessh.txt)
 COMMAND=$(ls -lA $LOCALFOLDER | grep -E '^total' | cut -d " " -f 2 > localssh.txt)
 REM=$(cat remotessh.txt)
 LOCAL=$(cat localssh.txt)

 echo $LOCAL
 echo $REM

 if [ $REM -eq $LOCAL ]
 then
      echo Directories are the same
 else
      echo Directories are differnt
 fi

 #diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2
rostfrei
quelle
1

Verwenden Sie sshfs, die über ssh eingehängt sind. Es wird nicht allzu schnell sein, aber Sie können Ihre gesamte Tool-Suite verwenden, die davon ausgeht, dass sich alles auf einem lokalen Dateisystem befindet. Eine Alternative ist NFS über einen Tunnel, der mit "ssh -w" erstellt wurde (oder andere Kommunikationen, bei denen ssh keine Einschränkung darstellt).

Skaperen
quelle
1

Sie können auch versuchen, den Ansatz zu verallgemeinern, indem Sie eine Bash-Funktion erstellen, möglicherweise in Ihrem ~ / .bashrc:

myrdiff() { ssh root@"$1" cat "$2" | diff -s - "$2" ; }

dann rufe es mit einem Konstrukt wie:

myrdiff vm20-x86-64 /etc/gdm/Init/Default

Wenn Sie diff mit -s aufrufen, wird auch gemeldet, ob die Dateien identisch sind.

Prost! Jim

Jim Swain
quelle