Как различать файлы / папки на разных машинах при условии, что единственное доступное соединение - это ssh?
Как различать файлы / папки на разных машинах при условии, что единственное доступное соединение - это ssh?
Ответы:
Вы можете сделать это с помощью подстановки процесса Bash :
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 .
//
после remotehost
важно. Одиночная косая черта не сработает
vimdiff /path/to/file scp://username@remotehost//path/to/file
Вот еще один быстрый и грязный рецепт командной строки. В отличие от выбранного ответа, он работает внутри make-файлов:
ssh [login]@[host] "cat [remote file]" | diff - "[local file]"
Используйте scp, чтобы перенести файлы на общий компьютер и посмотреть их там?
Или, если вы просто хотите узнать , отличаются ли файлы или нет, хэшируйте их с помощью md5sum на каждой машине.
Вы также можете посмотреть что-то вроде SSHFS , но я не знаю, насколько хорошо алгоритм вроде diff работает над этим.
rsync --dry-run
.
Одним из способов, если это возможно в вашей системе, было бы просто смонтировать удаленную файловую систему с помощью 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
Вот как я это сделал.
Я использовал 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 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, он также сообщит, идентичны ли файлы.
Ура! Джим
rsync -ani --delete / root@remotehost:/
но полный ответ дает более подробную информацию.