Wie unterscheidet man sich von ssh?


175

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


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')

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 .


7
Was ist mit Verzeichnissen? :)
Perlnika

1
Hier ist ein Beispiel: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//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


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]"

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.


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 .


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 root@182.18.158.207:/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.


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
    

2

Wenn Sie sshfs haben und Verzeichnisse unterscheiden müssen:

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

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


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 root@111.111.111.1 '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


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).


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.