In che modo differisce su ssh?


175

Come faccio a diffondere file / cartelle tra macchine a condizione che l'unica connettività disponibile sia ssh?


8
C'è una domanda relativamente simile a # 16661: Come posso differare due server RedHat Linux? . La risposta lì, per salvare i clic, è rsync -ani --delete / root@remotehost:/ma la risposta completa fornisce maggiori dettagli.
Owen Blacker,

Molte risposte qui, ma quale approccio è il più veloce?
Pl1nk,

Risposte:


150

Puoi farlo con la sostituzione del processo di Bash :

 diff foo <(ssh myServer 'cat foo')

Oppure, se entrambi si trovano su server remoti:

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

12
sì, qualcosa del genere, ma per le directory :)
Alexey Timanovsky,

Come intendi per directory, potrebbe sempre sostituire il gatto con ls
Kyle Brandt il

27
Ho il sospetto che "per le directory" significhi fare una diff ricorsiva
Ian Clelland,

9
Ho scoperto che questa tecnica non funzionava per me se il mio host remoto richiedeva una password. La richiesta della password non sembra funzionare bene con il reindirizzamento e non può essere completata correttamente. Se usi i tasti ssh questo non dovrebbe essere un problema.
Adam Franco,

2
Questa è un'ottima soluzione generale a molti problemi. Invece di 'cat foo' potresti usare 'find / foo / bar -type f | durante la lettura del file; fare eco "**** $ file"; cat "$ file"; fatto "e avresti un elenco dei nomi dei file e dei contenuti dei file da diff.
Paul Gear,

106

Finalmente ho trovato un'ottima soluzione: vimdiff

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

grazie a http://linux.spiney.org/remote_diff_with_vim_and_ssh vedi anche http://www.vim.org/scripts/script.php?script_id=1075 .


7
E le directory? :)
Perlnika,

1
Ecco un esempio: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
2 barre //dopo il remotehostè importante. La singola barra non funzionerà
Lee Chee Kiam

2
Se hai un nome utente diverso sull'host remoto rispetto al tuo host attuale, vimdiff /path/to/file scp://username@remotehost//path/to/file
useresti

come è possibile farlo con due host remoti con file di chiavi id_rsa @JaredC?
Manatax,

61

Se vuoi solo vedere quali file sono diversi, piuttosto che una diff dei file effettivi, puoi usare rsync --dry-run


10
rsync -n è la versione breve.
volni,

Ottimo - se devi usare un'altra porta, usa rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

Ecco un'altra ricetta veloce e sporca da riga di comando. A differenza della risposta scelta, funziona all'interno dei makefile:

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

Se la mia modifica non viene eseguita: questo metodo è superiore alla risposta scelta perché funziona con i makefile.
Chris Redford,

@Steve Dickinson - cosa intendi con "funziona all'interno dei makefile"?
Martin Vegter,

1
Questa è anche una buona soluzione se si soffre di allergia vim come me. :) Ho creato uno script bash che confronta lo stesso file su due host diversi, utile durante la migrazione dei servizi tra macchine e il confronto dei file di configurazione. Vedi gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

Usa scp per portare i file su una macchina comune e differli lì?

Oppure, se vuoi solo sapere se i file sono diversi o meno, esegui l'hash con md5sum su ogni macchina.

Potresti anche esaminare qualcosa come SSHFS , ma non so quanto bene un algoritmo come il diff funzioni su questo.


2
Un modo più semplice per vedere se i file sono diversi o no è rsync --dry-run.
Gerald Combs,

Mi ero dimenticato di SSHFS. Questo ha funzionato benissimo per me ...
Arod

7

Un modo, se è possibile sul tuo sistema, sarebbe semplicemente montare il filesystem remoto con sshfs .


diff è di solito un'azione one-shot, come verificare la differenza di configurazione. Il montaggio del filesystem ogni volta è possibile, ma non conveniente. Meglio tar e scp.
Alexey Timanovsky,

3

È possibile utilizzare rsyncin modalità di funzionamento a secco, come suggerito brevemente in un'altra risposta . Elenca tutti i file che sono diversi.

Per questo, usa le rvncopzioni ( r= ricorsivo, v= verboso, n= dry-run, c= checksum). Con rsyncin pull mode ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), un esempio è:

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

Ricorda , questo non fornisce informazioni sul fatto che il file locale o remoto sia più recente. Solo se differiscono.


2
  • sul tuo computer locale, crea una copia ricorsiva della directory che vuoi diff. Per esempio:

    cp -R dir replica
    
  • utilizzare rsync per replicare la directory remota sulla copia locale:

     rsync remote:/path/to/dir replica
    
  • usa diff per trovare la differenza tra la directory locale e la replica locale di quella remota:

    diff dir replica
    

2

Se hai sshfs e hai bisogno di directory diff:

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

1

Ecco come l'ho fatto.

Ho usato SFTP sul server remoto e ho inserito il mio nome utente / pwd quando richiesto. Quindi ho usato la directory creata nella directory .gvfs nella mia directory home nel comando diff.

diff -r --brief / home / dir utente / .gvfs / SFTP \ on \ freenas.local / percorso dir / dir1 / percorso dir locale / dir2


1

Questo è uno script che può aiutare a differenziare la cartella locale e la cartella remota .:

 #!/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

Usa sshfs montato su ssh. Non sarà così veloce, ma puoi usare la tua suite completa di strumenti che si aspettano che tutto sia su un filesystem locale. Un'alternativa è NFS su un tunnel realizzato con "ssh -w" (o altre comunicazioni in cui ssh non è la limitazione).


1

Puoi anche provare a generalizzare l'approccio creando una funzione bash, possibilmente nel tuo ~ / .bashrc:

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

quindi invocandolo con un costrutto come:

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

Invocando diff con -s, questo riporterà anche se i file sono identici.

Saluti! Jim

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.