it-swarm.com.de

Wie unterscheidet man sich über ssh?

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

180

Endlich habe ich eine tolle Lösung gefunden: vimdiff

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

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

108

Sie können dies mit Bashs Prozessersetzung tun:

 diff foo <(ssh myServer 'cat foo')

Oder wenn sich beide auf Remote-Servern befinden:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
153
Kyle Brandt

Wenn Sie nur sehen möchten, welche Dateien anders sind als ein Unterschied zu den tatsächlichen Dateien, können Sie rsync --dry-run Verwenden.

62
Rory

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

ssh [login]@[Host] "cat [remote file]" | diff - "[local file]"
16
Steve Dickinson

Verwenden Sie scp, um die Dateien auf einen gemeinsamen Computer zu bringen und dort zu verteilen?

Wenn Sie nur wissen möchten, ob die Dateien unterschiedlich sind oder nicht, hashen Sie sie mit md5sum auf jedem Computer.

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

10
Ian Clelland

Eine Möglichkeit, wenn es auf Ihrem System möglich ist, besteht darin, das Remote-Dateisystem einfach mit sshfs zu mounten.

7
Zoredache

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

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

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

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

3
zzapper

Wenn Sie sshfs haben und Verzeichnisse unterscheiden müssen:

mkdir remote_path
sshfs [email protected]:/path/ remote_path
diff -r path remote_path
2
metrix
  • 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
salva

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

myrdiff() { ssh [email protected]"$1" cat "$2" | diff -s - "$2" ; }

rufen Sie es dann mit einem Konstrukt wie dem folgenden auf:

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

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

Prost! Jim

1
Jim Swain

http://myfedora.co.za/2012/04/diff-two-remote-file-systems/

diff <(/ usr/bin/ssh [email protected] 'ls/opt/lib /') <(/ usr/bin/ssh [email protected] 'ls/tmp /') | grep -i ">" | sed 's /> // g'

1
Riaan

Hier ist, wie ich es gemacht habe.

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

diff -r --brief/home/user dir/.gvfs/SFTP\on\freenas.local/Pfad zu dir/dir1/Pfad zu lokalem Verzeichnis/dir2

1
Peter

Dies ist ein Skript, mit dessen Hilfe lokale und entfernte 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
1
stainless

Verwenden Sie sshfs über ssh gemountet. Es wird nicht so schnell gehen, aber Sie können Ihre gesamte Tool-Suite verwenden, die erwartet, 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 nicht die Einschränkung ist).

1
Skaperen

mit grep

remote ip: 172.16.98.130
remote file: /etc/ssh/keys-root/authorized_keys
local file: ~/.ssh/id_rsa.pub

Vergleichen Sie nun den Inhalt der Remote-Datei mit der lokalen Datei unter Verwendung von grep

grep -w "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] 'cat /etc/ssh/keys-root/authorized_keys')

überprüfen Sie den Erfolgsstatus des Befehls grep

echo $?
# 0

Verwenden Sie diese Idee, um die kennwortlose SSH-Anmeldung einzurichten:

if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected]8.130 cat /etc/ssh/keys-root/authorized_keys) &>/dev/null; then
  cat ~/.ssh/id_rsa.pub | sshpass -p "mypassword" ssh [email protected] "cat >> /etc/ssh/keys-root/authorized_keys"
fi

ssh [email protected]

Hinweis : Stellen Sie sicher, dass das Paket sshpass installiert ist, damit das Kennwort nicht interaktiv an den Befehl ssh übergeben wird.

0
Sathish