2014-01-07 5 views
33

Я пытаюсь рекурсивно сравнить каталог в локальном узле с каталогом на удаленной машине linux. Однако, когда я выполнить следующую команду:Как разбить каталоги на ssh

diff -r 'ssh [email protected]:/home/admin' /home/admin 

он не работает, говоря:

дифф: SSH [email protected]:/главная/администратора: Нет такого файла или каталога

Каков правильный способ сравнения рекурсивно содержимого каталогов?

Заранее спасибо

+1

Связанные: http://serverfault.com/questions/59140/how-do-diff-over-ssh – fedorqui

+1

ссылку рассказывает, как сравнивать файлы. он не работает при сравнении dirs –

ответ

30

Если вам не нужно дифф детали в файле, просто получить разницу имя реж/файла, то попробуйте следующее:

(Примечание: необходимо установить «SSH Войти без пароля», для деталей, отзыв URL: http://www.linuxproblem.org/art_9.html)

diff <(ssh [email protected] ls -R /home/admin) <(ls -R /home/admin) 
+2

, когда ssh запрашивает пароль, на него автоматически ответят из-за второго оператора <, который туннелирует свой вывод как пароль следующим образом : diff <(ssh [email protected] find/home/admin -printf '"% 8s% p \ n"') <(find/home/admin -printf '% 8s% p \ n') Эта система предназначен только для авторизованного использования. [email protected] пароль: Разрешение отклонено, повторите попытку. [email protected] пароль: Разрешение отклонено, повторите попытку. [email protected] пароль: Разрешение отклонено (публикация, пароль). –

+0

Вам необходимо установить пароль, отличный от пароля для сеанса SSH – BMW

+0

Я обновил свой ответ, просмотрите этот URL http://www.linuxproblem.org/art_9.html – BMW

15

Попробуйте использовать «Rsync» с «-п» вариант, который просто делает «сухой прогон» и говорит вам, что он будет делать.

+3

'-c' скажет rsync посмотреть контрольные суммы, а не только дату и длину – Mike

+3

' --delete'. Без него вы не увидите файлов, которые присутствуют на 2-й машине, но не на 1-м. Убедитесь, что у вас есть опция «-n» для сухого хода. – JellicleCat

+1

, конечно, вам также нужны '-r' или' -a' для вашей рекурсии, и не забудьте добавить обратную косую черту после имен каталогов (но потом не звезду), иначе как-то '--delete' не возвращает никаких удаления. поэтому ваша команда будет 'rsync -e 'ssh -p 22' -azvn --delete [email protected]:/home/admin// home/admin /'. – TNT

9

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

В качестве альтернативы вы можете запускать аналогичные команды find на обеих машинах, чтобы печатать деревья файлов (например, имена файлов, размеры и даты), а затем сравнивать выходы обоих с использованием diff. Это не было бы сравнить содержимое файла, конечно:

diff <(ssh host find /home/admin -printf '"%8s %P\n"') \ 
    <(find /home/admin -printf '%8s %P\n') 

Обратите внимание на двойное цитирование строки Printf формата в ssh вызова. Один слой удаляется реле ssh.

+0

Возможно, вам будет полезно «сортировать» выходы команд 'find', прежде чем сравнивать их с помощью' diff'; в этом случае я бы использовал путь как первый элемент в выходе: '<(find/home/admin -printf"% p% s \ n "| sort)' – Alfe

+1

лучше использовать% P, чем% p, так что вы можете diff, которые находятся в другой папке на каждом сервере – reox

+0

Спасибо @reox, я поменял свой ответ соответственно. Фактически, я обычно использую это в каталоге '(cd dir; find.-printf ...) ', и в этом случае не имеет значения, используется ли'% p' или '% P'. Вот оно. – Alfe

Смежные вопросы