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 или аналогичном и не заблокирован, дополнительные процессы не могут быть exec
ed пользовательскими сценариями, то вы можете попробовать запустить 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
Похоже, что у него есть следующие преимущества, которых нет у других ответов здесь:
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.