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

60

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?

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

Ответы:

39

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

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

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

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

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

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

Камил Кисиэль
источник
11
Это должно работать, когда временная метка + сравнение размера достаточно, чтобы решить, что нужно отправить. Как только потребуется контрольная сумма, весь удаленный файл будет считан по строке, а также отправлены обновления, поэтому убедитесь, что у вас установлены параметры rsync, так что он выполняет все или ничего для каждого файла (не используя --ignore- times или --checksum с указанием --whole-file может быть достаточно). Некоторые параметры, такие как --link-dest, вряд ли будут работать должным образом (или вообще) таким образом.
Дэвид Спиллетт
Спасибо за добавление некоторых деталей Дэвид. Вот такие ограничения по эффективности, о которых я думал, просто не очень четко сформулировали их :)
Камил Кисиэль
Это обходной путь с ограничениями, да, но он достаточно хорош, если нет способа вызвать «правильный» rsync
Валерий Лори
10

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

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
xioxox
источник
1
Хотя этот пост не отвечает на вопрос, он предоставляет полезную альтернативу
Дмитрий Чубаров
6

немного поздно, но вот как я это делаю, используя 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
Джонатан
источник
3
Как сказал @David Spillett в своем комментарии к более раннему ответу ( serverfault.com/questions/135618/… ), это будет работать, но является неэффективным использованием протокола rsync.
Эван Андерсон
2
Джонатан, я думаю, что твое решение неверно. Если вы монтируете удаленный диск и запускаете rsync, как если бы вы синхронизировали две локальные папки, при синхронизации всегда передается все, так как процесс rsync на вашем локальном компьютере вычисляет значения хеш-функции удаленных файлов. Это означает, что весь файл передается и преимущества rsync теряются. Редактировать: ах этот ответ был дан несколько раз ... прошу для репликации: D
Thekwasti
2

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

Игнасио Васкес-Абрамс
источник
2

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

Дэн Андреатта
источник
Этот ответ слишком короткий, чтобы быть полностью полезным, но если сторона сервера не может разрешить доступ к оболочке, но может разрешить (1) сервер rsync, прослушивающий локально (недоступно извне, для безопасности), и (2) туннель ssh, затем в принцип можно войти на сервер через правило, authorized_keysкоторое разрешает определенный туннель и работает, например sleep 86400. Тогда клиентская сторона может затем rsyncчерез туннель.
Стефан Гурихон
2

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

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

  • полностью использует 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/
Стефан Гурихон
источник
1
К сожалению, это не имеет ничего общего с использованием rsync с SFTP-сервером, но речь идет о настройке сервера OpenSSH, чтобы он rsyncмог работать, обходя аспект SFTP. Если вам предоставлен чужой SFTP-сервер, который вы не можете контролировать, этот ответ не решит проблему.
Malvineous
Вы правы. Я мог бы написать это, чтобы ответить на другой вопрос и опубликовать здесь по ошибке. Я собираюсь удалить свой ответ здесь.
Стефан Гурихон