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

Rsync поверх SSH, прекрасно работает каждый раз.

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

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

несоответствие версии протокола - чиста ли ваша оболочка? (см. справочную страницу 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?

8 ответов

Решение

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

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

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

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

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

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

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

Вместо Rsync rclone поддерживает синхронизацию из/в и монтирование общих сетевых ресурсов SFTP.

  1. Установить rclone
  2. rclone configи следуйте инструкциям по добавлению новой конфигурации удаленной конечной точки. Входsftpпри выборе серверной части протокола.
  3. rclone sync local_path remote:remote_path( документы ). Это может привести к потере данных.

IMO, rclone предоставляет более удобный для автоматизации CLI, чем LFTP.

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

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

Другие вопросы по тегам