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.