Comment puis-je différencier des fichiers/dossiers sur plusieurs machines à condition que la seule connectivité disponible soit ssh?
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 .
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')
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
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]"
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.
Une façon, s'il est possible sur votre système serait de simplement monter le système de fichiers distant avec sshfs .
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.
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
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
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
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'
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
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
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).
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
.