it-swarm-ru.tech

Как сделать различия по SSH?

Как различать файлы/папки на разных машинах при условии, что единственное доступное соединение - это ssh?

180
Alexey Timanovsky

Наконец-то я нашел отличное решение: vimdiff

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

спасибо http://linux.spiney.org/remote_diff_with_vim_and_ssh см. также http://www.vim.org/scripts/script.php?script_id=1075 .

108
Alexey Timanovsky

Вы можете сделать это с помощью Bash процесс подстановки :

 diff foo <(ssh myServer 'cat foo')

Или, если оба находятся на удаленных серверах:

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

Если вы просто хотите увидеть, какие файлы отличаются, а не различать фактические файлы, то вы можете использовать rsync --dry-run

62
Rory

Вот еще один быстрый и грязный рецепт командной строки. В отличие от выбранного ответа, он работает внутри make-файлов:

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

Используйте scp, чтобы перенести файлы на общий компьютер и посмотреть их там?

Или, если вы просто хотите узнать, являются ли файлы различными или нет, хешируйте их с помощью md5sum на каждой машине.

Вы также можете посмотреть что-то вроде SSHFS , но я не знаю, насколько хорошо алгоритм вроде diff работает над этим.

10
Ian Clelland

Одним из способов, если это возможно в вашей системе, было бы просто смонтировать удаленную файловую систему с помощью sshfs .

7
Zoredache

Вы можете использовать rsync в режиме пробного запуска, как кратко предложено в другой ответ . В нем перечислены любые файлы, которые отличаются.

Для этого используйте параметры rvnc (r = рекурсивный, v = подробный, n = пробный прогон, c = контрольная сумма] ). С rsync в режиме извлечения (rsync [OPTION...] [[email protected]]Host:SRC... [DEST]), например:

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

Помните , это не дает информации о том, является ли локальный или удаленный файл более новым. Просто если они отличаются.

3
zzapper

Если у вас есть sshfs и вам нужно проверить каталоги:

mkdir remote_path
sshfs [email protected]:/path/ remote_path
diff -r path remote_path
2
metrix
  • на локальном компьютере создайте рекурсивную копию каталога, который вы хотите просмотреть. Например:

    cp -R dir replica
    
  • используйте rsync для репликации удаленного каталога поверх локальной копии:

     rsync remote:/path/to/dir replica
    
  • используйте diff, чтобы найти разницу между локальным каталогом и локальной репликой удаленного:

    diff dir replica
    
2
salva

Вы также можете попробовать обобщить подход, создав функцию bash, возможно, в вашем ~/.bashrc:

myrdiff() { ssh [email protected]"$1" cat "$2" | diff -s - "$2" ; }

затем вызвать его с помощью конструкции, как:

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

Вызывая diff с параметром -s, он также сообщит, идентичны ли файлы.

Ура! Джим

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

Вот как я это сделал.

Я использовал SFTP для удаленного сервера и при появлении запроса ввел свое имя пользователя/pwd. Затем я использовал каталог, созданный в каталоге .gvfs в моем домашнем каталоге в команде diff.

diff -r --brief/home/user dir/.gvfs/SFTP\on\freenas.local/путь к dir/dir1/путь к локальному каталогу/dir2

1
Peter

Это скрипт, который может помочь разграничить локальную папку и удаленную папку.

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

Используйте sshfs смонтированный через ssh. Это будет не так быстро, но вы можете использовать свой полный набор инструментов, которые ожидают, что все будет в локальной файловой системе. Альтернативой является NFS через туннель, созданный с помощью "ssh -w" (или других коммуникаций, где ssh не является ограничением).

1
Skaperen

используя grep

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

Теперь сравните содержимое удаленного файла с локальным файлом, используя grep

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

проверить статус успешности команды grep

echo $?
# 0

Используя эту идею для настройки 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]30 "cat >> /etc/ssh/keys-root/authorized_keys"
fi

ssh [email protected]

Примечание: Убедитесь, что пакет sshpass установлен для передачи пароля неинтерактивно команде ssh.

0
Sathish