Вопрос: Как сделать diff по ssh?


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


162
2017-08-26 17:17


Источник


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


Ответы:


Вы можете сделать это с помощью Bash's замена процесса:

 diff foo <(ssh myServer 'cat foo')

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

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

137
2017-08-26 17:22



да, что-то вроде этого, но для справочников :) - Alexey Timanovsky
Как вы относитесь к каталогам, всегда можете заменить cat ls - Kyle Brandt♦
Я подозреваю, что «для каталогов» означает рекурсивный diff - Ian Clelland
Я обнаружил, что этот метод не работает для меня, если мой удаленный хост требует пароль. Запрос пароля не работал с переадресацией и не может быть успешно завершен. Если вы используете ключи ssh, это не должно быть проблемой. - Adam Franco
Это большое общее решение многих проблем. Вместо «cat foo» вы можете использовать «find / foo / bar-type f | при чтении файла; do echo "**** $ file"; cat "$ file"; done ', и у вас будет список имен файлов и содержимого файла для diff. - Paul Gear


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


98
2018-05-15 08:55



vimdiff сладко, спасибо! - Max Felker
Как насчет каталогов? :) - Perlnika
Вот пример: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile - vaichidrewar
2 слэша // после remotehost это важно. Одиночная косая черта не будет работать - Lee Chee Kiam
Если у вас другое имя пользователя на удаленном хосте, чем у вашего текущего хоста, вы должны использовать vimdiff /path/to/file scp://username@remotehost//path/to/file - JaredC


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


58
2017-09-04 11:14



rsync -n - короткая версия. - volni
Отлично - если вам нужно использовать другой порт, используйте rsync -e «ssh -p 2222» <SRC> <DST> - Samoth


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

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

15
2017-12-27 18:43



Если мое редактирование не проходит: этот метод превосходит выбранный ответ, потому что он работает с make-файлами. - Chris Redford
@Steve Dickinson - что вы подразумеваете под «работает внутри make-файлов»? - Martin Vegter
Это также хорошее решение, если вы страдаете от аллергии vim, как я. :) Я создал сценарий bash, который сравнивает один и тот же файл на двух разных хостах, полезный при переносе служб между машинами и сравнении файлов конфигурации. Видеть gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff - Janek


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

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

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


10
2017-08-26 17:19



Более простой способ увидеть, отличаются ли файлы или нет, это rsync --dry-run, - Gerald Combs
Я забыл о SSHFS. Это отлично поработало для меня ... - arod


Один из способов, если это возможно в вашей системе, - просто подключить удаленную файловую систему с помощью SSHFS,


7
2017-08-26 17:19



diff обычно является одноразовым действием, например, для проверки разницы в конфигурации. Монтаж файловой системы каждый раз возможен, но не удобен. Я бы лучше смола и scp. - Alexey Timanovsky


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

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

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

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


3
2018-04-29 12:21





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

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

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

    diff dir replica
    

2
2018-01-30 13:16





Если у вас есть sshfs и вам нужны директории diff:

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

2
2017-11-10 05:22





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

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

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


1
2018-01-01 20:30