sviluppo-web-qa.it

In che modo differisce su ssh?

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

180

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 .

108

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')
153
Kyle Brandt

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

62
Rory

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]"
16
Steve Dickinson

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

Oppure, se vuoi solo sapere se i file sono diversi o no, eseguili 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 quello.

10
Ian Clelland

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

7
Zoredache

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

Per questo, usa le opzioni rvnc (r = ricorsivo, v = dettagliato, n = corsa a secco, c = checksum ). Con rsync in modalità pull (rsync [OPTION...] [[email protected]]Host:SRC... [DEST]), un esempio è:

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

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

3
zzapper

Se hai sshfs e hai bisogno di directory diff:

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

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

myrdiff() { ssh [email protected]"$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

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

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
Peter

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

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

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
Skaperen

usando grep

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

Ora confronta il contenuto del file remoto con il file locale usando grep

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

controlla lo stato di successo del comando grep

echo $?
# 0

Utilizzando questa idea per configurare l'accesso senza password SSH:

if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] 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]

Nota: Assicurati che il pacchetto sshpass sia installato per passare la password in modo non interattivo al comando ssh.

0
Sathish