Comment diff sur ssh?


175

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


8
La question # 16661 est relativement similaire : Comment puis-je comparer deux serveurs RedHat Linux? . La réponse ici, pour enregistrer les clics, n’est rsync -ani --delete / root@remotehost:/que la réponse complète donne plus de détails.
Owen Blacker

Beaucoup de réponses ici, mais quelle approche est la plus rapide?
Pl1nk

1
Personne n'utilise des outils de diff visuel ?
Dan Dascalescu

Réponses:


150

Vous pouvez le faire avec la substitution de processus de Bash :

 diff foo <(ssh myServer 'cat foo')

Ou, si les deux sont sur des serveurs distants:

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

12
oui, quelque chose comme ça, mais pour les annuaires :)
Alexey Timanovsky

Comment voulez-vous dire pour les annuaires, pourrait toujours remplacer cat avec ls
Kyle Brandt

27
Je soupçonne que 'pour les annuaires' signifie faire un diff récursif
Ian Clelland

9
J'ai trouvé que cette technique ne fonctionnait pas pour moi si mon hôte distant avait besoin d'un mot de passe. L'invite de mot de passe ne semblait pas bien fonctionner avec la redirection et n'a pas pu être complétée avec succès. Si vous utilisez des clés ssh, cela ne devrait pas poser de problème.
Adam Franco

2
C'est une excellente solution générale à de nombreux problèmes. Au lieu de 'cat foo', vous pouvez utiliser 'find / foo / bar -type f | en lisant le fichier; echo "**** $ file"; cat "$ file"; done 'et vous auriez une liste des noms de fichiers et du contenu du fichier à diff.
Paul Gear

106

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 .


7
Qu'en est-il des annuaires? :)
Perlnika

1
Voici un exemple: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar le

4
2 barres obliques //après remotehostest important. Slash simple ne fonctionnera pas
Lee Chee Kiam

2
Si vous avez un nom d'utilisateur différent de celui de votre hôte actuel sur l'hôte distant, vous utiliserezvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC,

comment pouvez-vous faire cela avec deux hôtes distants avec les fichiers de clés id_rsa @JaredC?
Manatax

61

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


10
rsync -n est la version courte.
Volni

Parfait - si vous devez utiliser un autre port, utilisez rsync -e "ssh -p 2222" <SRC> <DST>
Samoth le

16

Voici une autre recette rapide et sale en ligne de commande. Contrairement à la réponse choisie, cela fonctionne dans les makefiles:

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

Si mon édition ne passe pas: cette méthode est supérieure à la réponse choisie car elle fonctionne avec les makefiles.
Chris Redford

@Steve Dickinson - qu'entendez-vous par "ça marche à l'intérieur des makefiles"?
Martin Vegter

1
C’est aussi une bonne solution si vous souffrez de l’allergie à Vim comme moi. :) J'ai créé un script bash qui compare le même fichier sur deux hôtes différents, ce qui est utile lors de la migration de services entre ordinateurs et lors de la comparaison de fichiers de configuration. Voir gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

Utilisez scp pour amener les fichiers sur une machine commune et les y afficher?

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

Vous pourriez aussi regarder quelque chose comme SSHFS , mais je ne sais pas comment un algorithme comme diff fonctionne par-dessus.


2
Un moyen plus facile de voir si les fichiers sont différents ou non est rsync --dry-run.
Gerald Combs

J'avais oublié SSHFS. Cela a très bien fonctionné pour moi ...
arod

7

Une façon possible, si cela est possible sur votre système, consiste simplement à monter le système de fichiers distant avec sshfs .


diff est généralement une action ponctuelle, comme pour vérifier la différence de configuration. Monter un système de fichiers à chaque fois est possible, mais pas pratique. Je ferais mieux de goudron et scp.
Alexey Timanovsky

3

Vous pouvez utiliser rsyncle mode de fonctionnement à sec, comme suggéré brièvement dans une autre réponse . Il répertorie tous les fichiers qui sont différents.

Pour cela, utilisez les rvncoptions ( r= récursif, v= verbeux, n= exécution à sec, c= somme de contrôle). En rsyncmode Pull ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), voici un exemple:

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

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


2
  • Sur votre ordinateur local, faites une copie récursive du répertoire que vous voulez 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

Si vous avez sshfs et avez besoin de répertoires diff:

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

1

Voici comment je l'ai fait.

J'ai utilisé SFTP sur le serveur distant et entré mon nom d'utilisateur / pwd à l'invite. Ensuite, j'ai utilisé le répertoire créé dans le répertoire .gvfs de mon répertoire personnel dans la commande diff.

diff -r --brief / home / répertoire utilisateur / .gvfs / SFTP \ on \ freenas.local / chemin d'accès au répertoire / répertoire1 / chemin d'accès au répertoire local / répertoire2


1

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

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

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 créé avec "ssh -w" (ou d'autres communications où ssh n'est pas la limitation).


1

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 en l'invoquant avec une construction comme:

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

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

À votre santé! Jim

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.