Чи можна використовувати rsync через sftp (без ssh оболонки)?


60

Rsync over ssh, чудово працює щоразу.

Однак спроба rsync до хоста, який дозволяє лише sftp входи, але не ssh логін, дає таку помилку:

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

невідповідність версії протоколу - чи ваша оболонка чиста? (для пояснення див. сторінку "rsync man" для пояснення) Помилка 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.

Наведене нижче посилання показує, що це завдання можна виконати за допомогою запобіжника з sshfs - проте воно надзвичайно повільне і не придатне для використання у виробництві.

Чи є шанс змусити rsync sftp працювати?


3
lftp зробить трюк. Я синхронізую локальне та віддалене з перемикачем -R

Чи знаєте ви, як команди обмежуються на сервері? Якщо це встановлено ForceCommand в sshd_config, то подивіться, чи можете ви змінити файл, на який вказує. Або якщо він встановлений командою в авторизованих_кейсах, то, можливо, ви можете отримати доступ до дозволених_кеїв через 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- разів або --checksum та наявність вказаного цілого файла). Деякі варіанти, такі як --link-dest, малоймовірно, спрацюють належним чином (або зовсім) таким чином.
Девід Спіллетт

Дякуємо, що додали деякі деталі, Девід. Ось такі обмеження в ефективності, про які я думав, просто не сформулювали їх так добре :)
Kamil Kisiel

Це вирішення з обмеженнями, так, але це досить добре, якщо немає можливості викликати "належного" rsync
Валерій Лурі

10

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

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

1
Хоча ця публікація не відповідає на питання, вона пропонує корисну альтернативу
Дмитро Чубаров

5

трохи пізно, але ось як я це роблю, використовуючи 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
Теквасті

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

Ти правий. Я, можливо, написав це, щоб відповісти на інше питання, і розмістив тут помилково. Я розглядаю тут свою відповідь.
Стефан Гурішон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.