Вопрос: Можно ли использовать rsync для sftp (без оболочки ssh)?


Rsync over ssh, отлично работает каждый раз.

Однако попытка rsync на хост, который разрешает только sftp-логины, но не ssh-логины, предоставляет следующую ошибку:

rsync -av / source ssh user @ remotehost: / target /

несоответствие версии протокола - это ваш   раковина чистая? (см. справочную страницу rsync   для объяснения) rsync error:   несовместимость протокола (код 2) в   compat.c (171) [sender = 3.0.6]

Вот соответствующий раздел на странице руководства rsync:

Это сообщение обычно вызвано вашими сценариями запуска или   удаленная установка оболочки   нежелательный мусор в потоке, который   rsync использует для   его транспорт. Способ диагностики этой проблемы - запустить   удаленная оболочка вроде этого:

          ssh remotehost /bin/true > out.dat

то посмотрите на out.dat. Если все работает правильно,   out.dat должен быть файлом нулевой длины.   Если вы получаете вышеуказанную ошибку   от rsync          то вы, вероятно, обнаружите, что out.dat содержит текст или   данные. Посмотрите содержимое и попробуйте   выработать то, что его производит.   наиболее          mon cause неправильно настроены сценарии запуска оболочки (такие   как .cshrc или .profile), которые содержат   вывода для неинтерактивных   логины.

Попытка этого в моей системе произвела следующее в out.dat:

ssh-dummy-shell: команда не разрешена.

Как я думал, хост не разрешает вход в систему ssh.

Следующие ссылка показывает, что эту задачу можно выполнить, используя плавкий предохранитель с sshfs - однако он очень медленный и не подходит для использования в производстве.

Есть ли шанс заставить rsync sftp работать?


49
2018-04-25 11:07


Источник


lftp сделает трюк. Я буду синхронизировать локально с пультом с помощью переключателя -R
Вы знаете, как команды ограничены на сервере? Если это так, задав ForceCommand в sshd_config, посмотрите, можете ли вы изменить файл, на который указывает. Или, если он задан командой в authorized_keys, возможно, вы можете получить доступ к файлам authorized_keys через sshfs и изменить их? - ptman
Вы можете попробовать УпрСИНХ: csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csync Видеть это ответ, - nachtigall
В конце концов, я сделал это с LFTP: lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port - nachtigall
@nachtigall знаете ли вы, как использовать lftp с несколькими входными файлами / список файлов и каталогов? - bortran


Ответы:


К сожалению, не напрямую. rsync требует чистой связи с оболочкой, которая позволит ему запустить удаленную копию rsync, когда бегают таким образом.

Если у вас есть какой-то способ длительных процессов прослушивания на хосте, вы можете попробовать запустить rsync вручную, слушая подключения на непривилегированном порту, но большинство методов для этого потребует надлежащего доступа к оболочке через SSH, и он полагается на устройства брандмауэра хостов, позволяющие подключаться к порту, который вы выбрали (и узел, в котором установлен rsync, в первую очередь). Однако использование rsync в качестве общедоступной службы (а не косвенно через SSH или подобное) обычно не рекомендуется для непубличных данных.

Если вы размещаете, вы можете создавать скрипты на PHP или аналогичные и не блокировать его, поэтому дополнительные процессы не могут быть execed пользовательскими сценариями, тогда вы можете попробовать запустить rsync в режиме прослушивания таким образом. Если ваш конец подключен (вы используете SSH, доступный для внешнего мира), вы можете попробовать это в обратном порядке - запустить скрипт rsync на сервере, но вместо того, чтобы прослушивать входящие подключения, обратитесь к своей локальной службе и синхронизируйте этот путь. Это все еще зависит от того, действительно ли rsync установлен на хост, который не является данным, или что вы можете загрузить рабочую копию, но не имеет последствий для безопасности запуска rsync-демона публично адресуемым способом и разговаривать с ним по незашифрованному канал.

Мессинг, как описано выше, может быть против политики хостов, хотя, даже если он вообще работает, и может заставить вас начать работу. Вам лучше спросить, можно ли включить полную оболочку для этой учетной записи и либо отказаться от rsync для этого хоста, либо отказаться от этого хоста и перемещаться в другом месте, если они этого не сделают.


36
2018-04-25 11:39



Обратите внимание, что это не обязательно полная оболочка; он просто должен разрешить команду rsync с правильными аргументами для запуска. Скорее полезно для этого. - sciurus


Теоретически, да. Вы можете подключить удаленную файловую систему на своей локальной машине использование FUSE, Затем вы можете запустить локальную копию rsync между смонтированным каталогом и локальным каталогом. Я лично не пробовал этого, но он должен работать теоретически. Вероятно, было бы намного менее эффективно выполнять rsync через SSH, потому что для выполнения сравнения потребуется, по меньшей мере, часть каждого файла.


15
2018-04-25 15:59



Это должно работать, когда сопоставление времени и размера достаточно, чтобы решить, что нужно отправить. Как только вам понадобится контрольная сумма, весь удаленный файл будет прочитан через линию, а также отправленные обновления, поэтому убедитесь, что у вас установлены параметры rsync, чтобы он делал все или ничего для каждого файла (не используя --ignore- times или --checksum и наличие - всего указанного файла может быть достаточно). Некоторые варианты, такие как -link-dest, вряд ли будут работать должным образом (или вообще) таким образом. - David Spillett
Спасибо, что добавили некоторые детали Дэвида. Такого рода ограничения в эффективности, о которых я думал, просто не сформулировали их довольно хорошо :) - Kamil Kisiel
Это обходной путь с ограничениями, да, но это достаточно хорошо, если нет способа вызвать «правильный» rsync - Valery Lourie


немного поздно, но вот как я это делаю, используя sshfs

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

4
2017-09-20 12:04



Как говорит @David Spillett в своем комментарии к более раннему ответу (serverfault.com/questions/135618/...), это будет работать, но это немного неэффективное использование протокола rsync. - Evan Anderson
jonathan, я думаю, ваше решение ошибочно. Если вы монтируете удаленный диск и выполняете rsync, как если бы вы синхронизировали две локальные папки, всегда происходит передача всего на синхронизацию, так как процесс rsync на вашей локальной машине вычисляет хэш-значения удаленных файлов. Это означает, что весь файл передается, а преимущества rsync теряются. Изменить: ах этот ответ был задан несколько раз ... sry для репликации: D - Thekwasti


Нет. Rsync работает путем запуска rsync с другой стороны и связи с ним, что означает, что требуется некоторая форма доступа к оболочке.


2
2018-04-25 11:23





Альтернативой было бы запустить rsync в качестве демона и подключиться к нему через туннель SSH.


2
2018-04-25 12:17



Этот ответ слишком короткий, чтобы быть полностью полезным, но если серверная сторона не может разрешить доступ к оболочке, но может позволить (1) сервер rsync прослушивать локально (недоступно извне, для обеспечения безопасности) и (2) туннель ssh, то в принципе можно войти на сервер с помощью правила в authorized_keys который позволяет конкретный туннель и работает, например. sleep 86400, Тогда клиентская сторона могла тогда rsync через туннель. - Stéphane Gourichon


Альтернативой использованию rsync является использование lftp (который может подключаться к sftp) и использование команды mirror. Например, можно сделать

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
2018-03-31 10:13





Вариант, сочетающий лучшие из всех

Похоже, что здесь есть следующие преимущества, которых нет в других ответах:

  • полностью обеспечивает SSH (безопасный)
  • полностью выгоды от rsync (протокол с пропускной способностью, все параметры rsync, такие как ограничение пропускной способности)
  • фактически (в отличие от sshfs, которые иногда сохраняют дни, но на практике все еще медленны)
  • не требуется произвольных команд оболочки на стороне сервера
  • не нужен сервер, чтобы разрешить туннели ssh
  • не нужен сервер для запуска rsync демон

Я еще не тестировал его, но я успешно использовал все эти функции, кроме rrsync,

Как это сделать

  • создать ключ локально с ssh-keygen (функция openSSH)
  • разрешить вход в систему только с этим конкретным ключом, с записью на сервере ~/.ssh/authorized_keys (функция openSSH)
  • связать этот ключ с определенной командой, с ~/.ssh/authorized_keys (функция openSSH), используя в качестве команды скрипт rrsync распределенный с rsync, что-то вроде command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Тогда вы можете rsync от клиента нормально.

Если вам нужна дополнительная информация

Ограничение доступа SSH к rsync | Гай Рутенберг

Один шаг выше ссылки выше

Команда в конце этой страницы может быть сокращена. В ~/.ssh/config создайте такую ​​строфу:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

то ваша команда rsync от клиента

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

становится

rsync -av user@remote: etc2/

0
2018-01-08 10:04