Come faccio a diffondere file / cartelle tra macchine a condizione che l'unica connettività disponibile sia ssh?
Come faccio a diffondere file / cartelle tra macchine a condizione che l'unica connettività disponibile sia ssh?
Risposte:
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')
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 .
//
dopo il remotehost
è importante. La singola barra non funzionerà
vimdiff /path/to/file scp://username@remotehost//path/to/file
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]"
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.
rsync --dry-run
.
Un modo, se è possibile sul tuo sistema, sarebbe semplicemente montare il filesystem remoto con sshfs .
È possibile utilizzare rsync
in modalità di funzionamento a secco, come suggerito brevemente in un'altra risposta . Elenca tutti i file che sono diversi.
Per questo, usa le rvnc
opzioni ( r
= ricorsivo, v
= verboso, n
= dry-run, c
= checksum). Con rsync
in 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.
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
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
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
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'
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
rsync -ani --delete / root@remotehost:/
ma la risposta completa fornisce maggiori dettagli.