- Вопрос или проблема
- Ответ или решение
- 1. Использование утилиты diff через SSH
- 2. Использование vimdiff для визуального сравнения
- 3. Использование rsync для проверки различий
- 4. Копирование файлов для локального сравнения
- 5. Подключение к удаленной файловой системе с помощью SSHFS
- 6. Использование скриптов для автоматизации
- 7. Проверка различий с использованием хешей
- Заключение
Вопрос или проблема
Как сравнить файлы/папки между машинами, если единственное доступное подключение – это ssh?
Вы можете сделать это с помощью подстановки процессов в Bash:
diff foo <(ssh myServer 'cat foo')
или то же самое с
ssh myServer cat foo | diff 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
Вот еще один быстрый и простой способ через командную строку. В отличие от выбранного ответа, он работает внутри makefiles:
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 [email protected]:/var/www/html/dev/ .
Помните, это не предоставляет информации о том, какой файл новее, локальный или удаленный. Только о том, отличаются ли они.
Если у вас есть sshfs и нужно сравнить каталоги:
mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path
-
на вашем локальном компьютере создайте рекурсивную копию каталога, который вы хотите сравнить. Например:
cp -R dir replica
-
используйте rsync, чтобы реплицировать удаленный каталог на локальную копию:
rsync remote:/path/to/dir replica
-
используйте diff, чтобы найти разницу между локальным каталогом и локальной репликой удаленного:
diff dir replica
Это скрипт, который может помочь сравнить локальную папку и удаленную папку:
#!/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 Каталоги идентичны
else
echo Каталоги разные
fi
#diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2
Используйте sshfs, смонтированный через ssh. Это не будет слишком быстро, но вы сможете использовать весь набор инструментов, которые ожидают, что все будет на локальной файловой системе. Альтернативой является NFS через туннель, созданный с помощью “ssh -w” (или других коммуникаций, где ssh не является ограничением).
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 для подключения к удаленному серверу и ввел свое имя пользователя/пароль, когда меня попросили.
Затем я использовал каталог, который был создан в каталоге .gvfs
в моем домашнем каталоге, в команде diff.
diff -r --brief /home/user dir/.gvfs/SFTP\ on\ freenas.local/path to dir/dir1 /path to local dir/dir2
Вы также можете попробовать обобщить подход, создав функцию 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 [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] "cat >> /etc/ssh/keys-root/authorized_keys"
fi
ssh [email protected]
Примечание:
Убедитесь, что пакет sshpass
установлен для передачи пароля не интерактивно команде ssh
.
Я использую | cat
в конце команды для интерактивных запросов пароля и sdiff
, потому что его легче читать, чем diff
:
Так что между локальным и удаленным, введите :
sdiff -s cat myfile<(ssh server1 'cat myfile') | cat
и между двумя серверами, введите :
sdiff -s <(ssh server1 'cat myfile') <(ssh server2 'cat myfile') | cat
Ответ или решение
Чтобы сравнить файлы или папки между машинами с использованием SSH, существует несколько методов, которые можно применять в зависимости от конкретной ситуации и требований. Ниже приведены разнообразные подходы к выполнению этой задачи, которые могут быть полезны как для системных администраторов, так и для разработчиков.
1. Использование утилиты diff
через SSH
Одним из наиболее простых способов сравнения файлов является использование утилиты diff
с помощью SSH для доступа к удаленным файлам:
-
Для сравнения локального файла с файлом на удаленной машине:
diff foo <(ssh myServer 'cat foo')
или:
ssh myServer cat foo | diff foo -
-
Если вам необходимо сравнить файлы на двух различных удаленных серверах, можно использовать следующий подход:
diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
2. Использование vimdiff
для визуального сравнения
Для более удобного визуального сравнения файлов можно использовать vimdiff
, который позволяет удобно просматривать различия цветом и различными форматами:
vimdiff /path/to/file scp://remotehost//path/to/file
Вы также можете установить скрипт, который расширяет возможности выполнения diff
через SSH. Подробная информация о таких скриптах доступна здесь.
3. Использование rsync
для проверки различий
Если нужно просто узнать, какие файлы отличаются, без глубокого анализа их содержимого, можно использовать rsync
в режиме с симуляцией (dry-run):
rsync --dry-run -rvnc [USER@]HOST:/path/to/dir/ /local/dir/
Эта команда выдаст список файлов, которые отличаются между удаленной и локальной директориями, не копируя ни один файл.
4. Копирование файлов для локального сравнения
Если доступ к сети не ограничен, можно использовать scp
для копирования файлов с удаленной машины на локальную, а затем выполнить сравнение:
scp user@remote:/path/to/file /local/path
diff /local/path/file /local/another_file
5. Подключение к удаленной файловой системе с помощью SSHFS
SSHFS позволяет монтировать удаленную файловую систему на локальную машину, что значительно упрощает доступ к файлам и директориям. Вот пример монтирования:
sshfs user@host:/path/to/remote/ /local/mountpoint
diff -r /local/path /local/mountpoint
6. Использование скриптов для автоматизации
Можно создать скрипт на bash, который будет автоматически проверять соответствие между локальными и удаленными директориями:
#!/bin/bash
LOCALFOLDER=/path/to/local/dir
REMOTEFOLDER=user@host:/path/to/remote/dir
rsync -rvn "$REMOTEFOLDER/" "$LOCALFOLDER/" | grep '^>f' > diff_output.txt
7. Проверка различий с использованием хешей
Если вы хотите проверить, различаются ли файлы на основе их содержимого, можно использовать хеш-функции. Например, с помощью md5sum
:
ssh user@host 'md5sum /path/to/remote/file' && md5sum /path/to/local/file
Заключение
Существует множество способов сравнения файлов и папок между машинами с использованием SSH. Выбор подхода зависит от ваших специфических требований — будь то необходимость в визуальном сравнении, анализе содержимого или проверке различий. Используя описанные выше методы, вы сможете эффективно управлять и производить сравнение файлов в распределенной среде.