Як відрізнятись від ssh?


175

Як я відрізняю файли / папки на машинах за умови, що єдине доступне з'єднання - ssh?


8
Є відносно подібне запитання на # 16661: Як я можу відрізняти два сервери RedHat Linux? . Відповідь, щоб зберегти кліки, є, rsync -ani --delete / root@remotehost:/але повна відповідь дає більш детальну інформацію.
Оуен Блекер

Тут досить багато відповідей, але який підхід швидше?
pl1nk

Відповіді:


150

Ви можете це зробити із заміною процесу Баша :

 diff foo <(ssh myServer 'cat foo')

Або якщо обидва знаходяться на віддалених серверах:

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

12
так, щось подібне, але для каталогів :)
Олексій Тимановський,

Як ви маєте на увазі каталоги, завжди міг замінити кота на лс
Кайл Брандт,

27
Я підозрюю, що "для каталогів" означає робити рекурсивну різницю
Ian Clelland

9
Я виявив, що ця методика не працює для мене, якщо мій віддалений хост вимагає пароль. Здається, що запит на введення пароля не працює добре з перенаправленням, і його не вдалося виконати. Якщо ви використовуєте ключі ssh, це не повинно бути проблемою.
Адам Франко

2
Це чудове загальне рішення багатьох проблем. Замість 'cat foo' ви можете використовувати 'find / foo / bar-type f | під час читання файлу; do echo "**** $ файл"; кішка "$ файл"; зроблено ", і ви маєте список назв файлів та вмісту файлів, які будуть різними.
Пол Гір

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важливо. Один косою рисою не вийде
Lee Chee Kiam

2
Якщо ви маєте інше ім'я користувача на віддаленому хості, ніж ваш поточний, ви користуєтесьvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC

як це можна зробити з двома віддаленими хостами з файлами ключових файлів id_rsa @JaredC?
Манатакс

61

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


10
rsync -n - коротка версія.
volni

Чудово - якщо вам потрібно скористатися іншим портом, використовуйте rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

Ось ще один швидкий і брудний рецепт командного рядка. На відміну від обраної відповіді, вона працює всередині файлів:

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

Якщо моє редагування не вдалося виконати: цей метод перевершує обрану відповідь, оскільки він працює з файлами.
Кріс Редфорд

@Steve Dickinson - що ви маєте на увазі під "роботою всередині makefiles"?
Мартін Вегтер

1
Це також приємне рішення, якщо ви страждаєте від алергії на вім, як я. :) Я створив сценарій bash, який порівнює один і той же файл на двох різних хостах, корисний під час міграції служб між машинами та порівняння файлів конфігурацій. Дивіться gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Янек

10

Використовуйте scp, щоб перенести файли на загальну машину і відрізняти їх там?

Або, якщо ви просто хочете знати , якщо файли мають різні чи ні, хеш їх з допомогою md5sum на кожній машині.

Ви також можете розглянути щось на зразок SSHFS , але я не знаю, наскільки добре працює алгоритм на зразок diff.


2
Простіший спосіб зрозуміти, чи файли відрізняються чи ні rsync --dry-run.
Джеральд Гребінь

Я забув про SSHFS. Це спрацювало для мене чудово ...
арод

7

Один із способів, якщо це можливо у вашій системі, - це просто встановити віддалену файлову систему за допомогою sshfs .


діф - це звичайно однофакторні дії, як перевірити різницю конфігурацій. Можливість монтажу файлової системи кожного разу можлива, але не зручна. Я б краще дьогтю та котлет.
Олексій Тимановський

3

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

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

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

Пам'ятайте , що це не містить інформації про те, чи локальний або віддалений файл новіший. Просто, якщо вони відрізняються.


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

1

Ось як я це зробив.

Я використовував SFTP на віддаленому сервері і вводив своє ім'я користувача / pwd при появі запиту. Тоді я використав dir, який був створений у .gvfs dir у моєму домашньому каталозі в команді diff.

diff -r - короткий / домашній / користувач dir / .gvfs / SFTP \ on \ freenas.local / шлях до dir / dir1 / шлях до локального dir / 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 не є обмеженням).


1

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

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

потім викликає його конструкцією на зразок:

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

Якщо викликати diff з -s, це також повідомить, якщо файли однакові.

Ура! Джим

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.