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

175

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

Алексей Тимановский
источник
8
Относительно схожий вопрос на # 16661: как я могу различить два сервера RedHat Linux? , Ответ там, чтобы сохранить клики, rsync -ani --delete / root@remotehost:/но полный ответ дает более подробную информацию.
Оуэн Блэкер
Здесь довольно много ответов, но какой подход быстрее?
pl1nk
1
Никто не использует визуальные инструменты сравнения ?
Дан Даскалеску

Ответы:

150

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

 diff foo <(ssh myServer 'cat foo')

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

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
Кайл Брандт
источник
12
ага, как то так, но для каталогов :)
Алексей Тимановский
Как вы имеете в виду для каталогов, всегда можно заменить cat на ls
Кайл Брандт
27
Я подозреваю, что «для каталогов» означает проведение рекурсивного сравнения
Ian Clelland
9
Я обнаружил, что эта техника не работает для меня, если мой удаленный хост требует пароль. Запрос пароля, похоже, не работал с перенаправлением и не может быть успешно завершен. Если вы используете ssh-ключи, это не должно быть проблемой.
Адам Франко
2
Это отличное общее решение многих проблем. Вместо 'cat foo' вы можете использовать 'find / foo / bar -type f | во время чтения файла; сделать эхо "**** $ file"; cat "$ file"; готово », и у вас будет список имен файлов и содержимого файлов для сравнения.
Пол Гир
106

Наконец-то я нашел отличное решение: 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 .

Алексей Тимановский
источник
7
Как насчет каталогов? :)
Perlnika
1
Вот пример: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar
4
2 косые черты //после remotehostважно. Одиночная косая черта не сработает
Ли Чи Киам
2
Если у вас есть другое имя пользователя на удаленном хосте, чем у вашего текущего хоста, вы должны использоватьvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC
Как вы можете сделать это с двумя удаленными хостами с файлами ключей id_rsa @JaredC?
Manatax
61

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

Рори
источник
10
rsync -n это короткая версия.
Вольни
Отлично - если вам нужно использовать другой порт, используйте rsync -e "ssh -p 2222" <SRC> <DST>
Самот
16

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

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"
Стив Дикинсон
источник
Если мое редактирование не проходит: этот метод превосходит выбранный ответ, потому что он работает с make-файлами.
Крис Редфорд
@ Стив Дикинсон - что ты имеешь в виду под словом «это работает внутри make-файлов»?
Мартин Вегтер
1
Это также хорошее решение, если вы страдаете от аллергии на Вим, как и я. :) Я создал скрипт bash, который сравнивает один и тот же файл на двух разных хостах, что полезно при переносе служб между компьютерами и сравнении конфигурационных файлов. См. Gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Янек
10

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

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

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

Ян Клелланд
источник
2
Более простой способ увидеть, отличаются ли файлы или нет rsync --dry-run.
Джеральд Комбс
Я забыл о SSHFS. Это отлично сработало для меня ...
вышло
7

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

Zoredache
источник
diff обычно одноразовое действие, например, чтобы проверить разницу в конфигурации. Монтирование файловой системы каждый раз возможно, но не удобно. Я бы лучше смол и SCP.
Алексей Тимановский
3

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

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

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

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

zzapper
источник
2
  • на локальном компьютере создайте рекурсивную копию каталога, который вы хотите просмотреть. Например:

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

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

    diff dir replica
    
Сальва
источник
2

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

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path
Metrix
источник
1

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

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

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

Питер
источник
1

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

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

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

Skaperen
источник
1

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

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

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

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

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

Ура! Джим

Джим Суэйн
источник