web-dev-qa-db-fra.com

Comment diff sur ssh?

Comment puis-je différencier des fichiers/dossiers sur plusieurs machines à condition que la seule connectivité disponible soit ssh?

180
Alexey Timanovsky

Enfin, j'ai trouvé une excellente solution: vimdiff

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

merci à http://linux.spiney.org/remote_diff_with_vim_and_ssh voir aussi http://www.vim.org/scripts/script.php?script_id=1075 .

108

Vous pouvez le faire avec Bash's substitution de processus :

 diff foo <(ssh myServer 'cat foo')

Ou, si les deux se trouvent sur des serveurs distants:

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

Si vous voulez simplement voir quels fichiers sont différents, plutôt qu'un diff des fichiers réels, vous pouvez utiliser rsync --dry-run

62
Rory

Voici une autre recette de ligne de commande rapide et sale. Contrairement à la réponse choisie, cela fonctionne à l'intérieur des makefiles:

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

Utiliser scp pour amener les fichiers sur une machine commune et les différencier là-bas?

Ou, si vous voulez simplement savoir si les fichiers sont différents ou non, hachez-les avec md5sum sur chaque machine.

Vous pouvez également examiner quelque chose comme SSHFS , mais je ne sais pas si un algorithme comme diff fonctionne bien.

10
Ian Clelland

Une façon, s'il est possible sur votre système serait de simplement monter le système de fichiers distant avec sshfs .

7
Zoredache

Vous pouvez utiliser rsync en mode de marche à sec, comme suggéré brièvement dans ne autre réponse . Il répertorie tous les fichiers différents.

Pour cela, utilisez les options rvnc (r = récursif, v = verbeux, n = run-dry, c = checksum ). Avec rsync en mode pull (rsync [OPTION...] [USER@]Host:SRC... [DEST]), un exemple est:

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

Rappelez-vous , cela ne fournit aucune information sur le fait que le fichier local ou distant soit plus récent. Juste s'ils diffèrent.

3
zzapper

Si vous avez sshfs et devez différencier les répertoires:

mkdir remote_path
sshfs user@Host:/path/ remote_path
diff -r path remote_path
2
metrix
  • sur votre machine locale, faites une copie récursive du répertoire que vous souhaitez différencier. Par exemple:

    cp -R dir replica
    
  • utilisez rsync pour répliquer le répertoire distant sur la copie locale:

     rsync remote:/path/to/dir replica
    
  • utilisez diff pour trouver la différence entre le répertoire local et la réplique locale du répertoire distant:

    diff dir replica
    
2
salva

Vous pouvez également essayer de généraliser l'approche en créant une fonction bash, éventuellement dans votre ~/.bashrc:

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

puis l'invoquer avec une construction comme:

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

En appelant diff avec -s, cela signale également si les fichiers sont identiques.

À votre santé! 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

Voici comment je l'ai fait.

J'ai utilisé SFTP sur le serveur distant et entré mon nom d'utilisateur/pwd lorsque vous y êtes invité. J'ai ensuite utilisé le répertoire créé dans le répertoire .gvfs de mon répertoire personnel dans la commande diff.

diff -r --brief/home/user dir/.gvfs/SFTP\on\freenas.local/path to dir/dir1/path to local dir/dir2

1
Peter

Ceci est un script qui peut aider à différencier le dossier local et le dossier distant .:

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

Utilisez sshfs monté sur ssh. Ce ne sera pas si rapide, mais vous pouvez utiliser votre suite complète d'outils qui s'attendent à ce que tout se trouve sur un système de fichiers local. Une alternative est NFS sur un tunnel fait avec "ssh -w" (ou d'autres communications où ssh n'est pas la limitation).

1
Skaperen

en utilisant grep

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

Comparez maintenant le contenu du fichier distant avec le fichier local en utilisant grep

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

vérifier l'état de réussite de la commande grep

echo $?
# 0

En utilisant cette idée pour configurer la connexion sans mot de passe 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]

Remarque: Assurez-vous que le package sshpass est installé pour passer le mot de passe de manière non interactive à la commande ssh.

0
Sathish