Как мне различать файлы / папки на разных машинах при условии, что единственное доступное соединение - 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
команда.