Comment diff sur ssh?

175

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

Alexey Timanovsky
la source
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')
Kyle Brandt
la source
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 .

Alexey Timanovsky
la source
7
Qu'en est-il des annuaires? :)
Perlnika
1
Voici un exemple: vimdiff .bash_profile scp: //[email protected]//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

Rory
la source
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]"
Steve Dickinson
la source
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.

Ian Clelland
la source
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 .

Zoredache
la source
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 [email protected]:/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.

zzapper
la source
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
    
salve
la source
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
metrix
la source
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

Peter
la source
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 [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
inoxydable
la source
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).

Skaperen
la source
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

Jim Swain
la source