Назад | Перейти на главную страницу

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

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

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

rsync -av / источник ssh пользователь @ удаленный хост: / цель /

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

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

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

          ssh remotehost /bin/true > out.dat

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

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

ssh-dummy-shell: Команда запрещена.

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

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

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

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

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

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

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

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

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

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

немного поздно, но вот как я это делаю, используя 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

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

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

  • все преимущества 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/

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

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