Назад | Перейти на главную страницу

Как сделать разницу по ssh?

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

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

 diff foo <(ssh myServer 'cat foo')

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

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

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

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

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

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

Использовать scp для переноса файлов на общий компьютер и их там сравнения?

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

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

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

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

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

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

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

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

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

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

    diff dir replica
    

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

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

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

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

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

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

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

http://myfedora.co.za/2012/04/diff-two-remote-file-systems/

diff <(/ usr / bin / ssh user1@192.168.122.1 'ls / opt / lib /') <(/ usr / bin / ssh user2@192.168.122.1 'ls / tmp /') | grep -i ">" | sed 's /> // g'

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

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

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

затем вызывая его с такой конструкцией:

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

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

Ура! Джим

с помощью 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 root@172.16.98.130 'cat /etc/ssh/keys-root/authorized_keys')

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

echo $?
# 0

Используя эту идею для настройки SSH входа без пароля:

if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh root@172.16.98.130 cat /etc/ssh/keys-root/authorized_keys) &>/dev/null; then
  cat ~/.ssh/id_rsa.pub | sshpass -p "mypassword" ssh root@172.16.98.130 "cat >> /etc/ssh/keys-root/authorized_keys"
fi

ssh root@172.16.98.130

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