Wie kann ich Dateien / Ordner zwischen Computern unterscheiden, vorausgesetzt, die einzige verfügbare Konnektivität ist ssh?
Wie kann ich Dateien / Ordner zwischen Computern unterscheiden, vorausgesetzt, die einzige verfügbare Konnektivität ist ssh?
Antworten:
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')
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 .
//
nach dem remotehost
ist wichtig. Einzelne Schrägstrich wird nicht funktionieren
vimdiff /path/to/file scp://username@remotehost//path/to/file
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
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]"
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.
rsync --dry-run
.
Eine Möglichkeit, wenn es auf Ihrem System möglich ist, besteht darin, das entfernte Dateisystem einfach mit sshfs einzuhängen .
Sie können den rsync
Trockenlaufmodus verwenden, wie in einer anderen Antwort kurz vorgeschlagen . Es werden alle Dateien aufgelistet, die unterschiedlich sind.
Verwenden Sie dazu die rvnc
Optionen ( r
= rekursiv, v
= ausführlich, n
= Probelauf, c
= Prüfsumme). Im rsync
Pull-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.
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
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
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
http://myfedora.co.za/2012/04/diff-two-remote-file-systems/
diff <(/ usr / bin / ssh user1@192.168.122.1 'ls / opt / lib /') <(/ usr / bin / ssh user2@192.168.122.1 'ls / tmp /') | grep -i ">" | sed 's /> // g'
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).
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
rsync -ani --delete / root@remotehost:/
aber die vollständige Antwort gibt mehr Details.