Как использовать diff по ssh?

Вопрос или проблема

Как сравнить файлы/папки между машинами, если единственное доступное подключение – это 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-tools (debian) содержит ssh-diff:

$ ssh-diff file [user@]hostname[:file]

Ответ или решение

Чтобы сравнить файлы или папки между машинами с использованием 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. Выбор подхода зависит от ваших специфических требований — будь то необходимость в визуальном сравнении, анализе содержимого или проверке различий. Используя описанные выше методы, вы сможете эффективно управлять и производить сравнение файлов в распределенной среде.

Оцените материал
Добавить комментарий

Капча загружается...