Как различать файлы/папки на разных машинах при условии, что единственное доступное соединение - это ssh?
Наконец-то я нашел отличное решение: 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 .
Вы можете сделать это с помощью Bash процесс подстановки :
diff foo <(ssh myServer 'cat foo')
Или, если оба находятся на удаленных серверах:
diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
Если вы просто хотите увидеть, какие файлы отличаются, а не различать фактические файлы, то вы можете использовать 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...] [[email protected]]Host:SRC... [DEST]
), например:
rsync -rvnc [email protected]:/var/www/html/dev/ .
Помните , это не дает информации о том, является ли локальный или удаленный файл более новым. Просто если они отличаются.
Если у вас есть sshfs и вам нужно проверить каталоги:
mkdir remote_path
sshfs [email protected]:/path/ remote_path
diff -r path remote_path
на локальном компьютере создайте рекурсивную копию каталога, который вы хотите просмотреть. Например:
cp -R dir replica
используйте rsync для репликации удаленного каталога поверх локальной копии:
rsync remote:/path/to/dir replica
используйте diff, чтобы найти разницу между локальным каталогом и локальной репликой удаленного:
diff dir replica
Вы также можете попробовать обобщить подход, создав функцию bash, возможно, в вашем ~/.bashrc:
myrdiff() { ssh [email protected]"$1" cat "$2" | diff -s - "$2" ; }
затем вызвать его с помощью конструкции, как:
myrdiff vm20-x86-64 /etc/gdm/Init/Default
Вызывая diff с параметром -s, он также сообщит, идентичны ли файлы.
Ура! Джим
http://myfedora.co.za/2012/04/diff-two-remote-file-systems/
diff <(/ usr/bin/ssh [email protected] 'ls/opt/lib /') <(/ usr/bin/ssh [email protected] 'ls/tmp /') | grep -i ">" | sed 's /> // g'
Вот как я это сделал.
Я использовал SFTP для удаленного сервера и при появлении запроса ввел свое имя пользователя/pwd. Затем я использовал каталог, созданный в каталоге .gvfs в моем домашнем каталоге в команде diff.
diff -r --brief/home/user dir/.gvfs/SFTP\on\freenas.local/путь к dir/dir1/путь к локальному каталогу/dir2
Это скрипт, который может помочь разграничить локальную папку и удаленную папку.
#!/bin/bash
LOCALFOLDER=/var/www/tee
REMOTEFOLDER=$(ssh [email protected] '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
Используйте sshfs смонтированный через ssh. Это будет не так быстро, но вы можете использовать свой полный набор инструментов, которые ожидают, что все будет в локальной файловой системе. Альтернативой является NFS через туннель, созданный с помощью "ssh -w" (или других коммуникаций, где ssh не является ограничением).
используя 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 [email protected] 'cat /etc/ssh/keys-root/authorized_keys')
проверить статус успешности команды grep
echo $?
# 0
Используя эту идею для настройки SSH без пароля:
if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] cat /etc/ssh/keys-root/authorized_keys) &>/dev/null; then
cat ~/.ssh/id_rsa.pub | sshpass -p "mypassword" ssh [email protected]130 "cat >> /etc/ssh/keys-root/authorized_keys"
fi
ssh [email protected]
Примечание: Убедитесь, что пакет sshpass
установлен для передачи пароля неинтерактивно команде ssh
.