Запустите diff между локальными и удаленными файлами

39

Я подключен к хосту через sshи хочу сравнить (скажем, с diff) определенный файл конфигурации с его аналогом на другом хосте, также доступном через ssh, без необходимости предварительно загружать удаленный файл вручную перед запуском diff.

fduff
источник
Вы можете смонтировать удаленный каталог с помощью SSHFS, а затем получить к нему доступ, как если бы он был локальным.
Бармар

Ответы:

57
ssh user@remote_host "cat remote_file.txt" | diff - local_file.txt

Источник

Polym
источник
1
Не будет ли труба просто загрузить результаты cat, которые на самом деле являются просто оригинальным файлом?
Стейн де Витт
1
канал отправит результат удаленной sshкоманды в команду, diffкоторая ожидает сравнения stdinс локальным файлом.
fduff
1
Может быть, я неверно истолковываю требование «без загрузки удаленного файла». Я думаю, что OP означает «без необходимости вручную загружать удаленный файл». :) РЕДАКТИРОВАТЬ: Ах ты ОП. :)
Стейн де Витт
@StijndeWitt, да, я хотел избежать необходимости сначала
проверять
18

Пытаться:

diff local_file <(ssh user@server 'cat remote_file')

или используя vimdiff:

vimdiff local_file scp://server//path/to/remote_file
cuonglm
источник
Работает diff local_file <(ssh user@server 'cat remote_file')только для SSH без пароля? Похоже, я не могу получить запрос пароля с ним ...
sdbbs
1
@sdbbs: процесс подстановки выполнялся в фоновом режиме, а стандартный вывод записывается в именованный канал (или анонимный именованный канал), поэтому вы не получите запрос пароля. Попробуй cat <(ssh user@server 'cat remote_file')и cat < <(ssh user@server 'cat remote_file')увидишь различия.
cuonglm
9

Может быть, это не полезно в вашем конкретном случае, но я часто просто использую

sum -r

на каждой машине и вручную сравнивайте контрольные суммы. Это позволяет сравнивать файлы, даже если они недоступны через ssh-соединение. Конечно, все, что он отвечает, это «они идентичны», но часто этого достаточно для моих нужд. Это также позволяет легко проверить, что один и тот же файл одинаков на 3 или 4 или более компьютерах.

MJB
источник
2
Я могу себе представить, что для больших файлов или медленных соединений это может быть очень полезно. Это экономит загрузку всего файла для случаев, когда файлы фактически отличаются. Лучший сценарий Bash, чем я, вероятно, может объединить этот ответ с ответами, приведенными выше, с использованием пульта дистанционного управления, catчтобы фактически запустить catкоманду только тогда, когда будет определено, что файлы различаются.
Стейн де Витт
1
Командование info coreutils 'sum invocation'говорит, в частности: «Для совместимости предоставляется« сумма »; программа« cksum »(см. Следующий раздел) предпочтительнее в новых приложениях».
Теему Лейсти
1

Если вы предпочитаете более визуальный подход в терминальной сессии. У полночного командира есть опция удаленной файловой системы (опция SFTP-ссылка ... в меню) и опция визуального сравнения файлов. Он не устанавливается по умолчанию в большинстве систем Linux, но доступен в большинстве базовых репозиториев. шаги:

  1. Запустите Midnight Commander (команда:) mcв папке, содержащей файл для сравнения
  2. С другой стороны (например, меню Right ) создайте ссылку sftp на другой сервер в той же папке ( sftp://<user>@<servername>/<path>).
  3. С помощью insклавиши выберите / выделите файлы для сравнения. ( tabизменения между левой и правой панелью).
  4. В меню « Команда» выберите « Сравнить файлы».

Примечание. Доступ к меню полуночного командира обычно можно получить с помощью мыши во время сеанса терминала. Если это не работает, F9вы попадаете в меню.

Fholst
источник