Запустіть rsync з дозволом root на віддаленій машині


32

Я хочу синхронізувати папку зі своєї машини з папкою на віддаленій машині. Віддаленою папкою можна керувати лише користувачем root. У мене є обліковий запис на віддаленій машині, яким можна користуватися sudo. Як я можу запустити rsync таким чином, щоб він мав дозволи на root на віддаленій машині?

Я спробував таке:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

Але (після введення пароля) я отримую таку помилку:

sudo: no tty present and no askpass program specified

Ви не можете змінити дозволи у віддаленій папці, щоб ваш користувач мав доступ до неї?
Філ

1
На жаль, це не варіант.
Пітер

Набагато краще перевірити відповідь на те саме питання на Unix SE unix.stackexchange.com/questions/92123/… .
ndemou

Відповіді:


12

Спробуйте це рішення. У налаштуванні файлу sudoers ( /etc/sudoers) користувач так:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsyncкаже , sudoщо , коли ваш користувач працює /usr/bin/rsyncабо тільки rsyncщо пароль не потрібно.

Тоді ваш оригінал --rsync-path="sudo rsync"повинен працювати.


Я використовував параметр sudo rsync без встановлення імені користувача ALL ... після того, як rsync виконано. на пульті, коли я намагаюся CD або ls. Мені відмовлено в дозволі. хоч я корінь. я повинен судо до ls. але у випадку з CD це навіть неможливо. Я намагався заглушити всі каталоги та файли. все ще не працювало. хтось знає причину і як її виправити?
Похмурий крапку з комою

2
ви також повинні сказати, як редагувати файл sudoers
Джонатан

2
Про наслідки цього виправлення див. У unix.stackexchange.com/a/92397/128237 .
BrainStorm.exe

11

Це рішення, яке я придумав:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

Трохи місії!


12
Сподіваюся, ви визнаєте, що ваш пароль буде видно в командному рядку. Це повинно бути видно протягом тривалого часу роботи rsync.
BillThor

1
де видно пароль? Просто в локальному полі в командному рядку? Або такий підхід створює і віддалені вразливості? Я намагаюся зрозуміти відповідь вище та наслідки використання цього рішення. Я задав питання тут: superuser.com/questions/398146/…
MountainX

@MountainX Це буде видно у списку процесів (наприклад ps aux). Тест:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/exampleпотім відкрийте термінал на віддаленій машині і ps aux | grep find. find /використовується лише тому, що це перше, що мені прийшло в голову з великою тривалістю виконання.
Іван Вучиця

1
Я знаю, що це старе, але якщо ви хочете уникнути пароля в команді, ви можете використовувати клавіші для ssh, а на віддаленій машині додайте свого користувача до файлу sudoers із прапором NOPASSWD: ALL. Дивіться відповідь найвищого рангу за наступним посиланням. ПРИМІТКА. Це не прийнята відповідь: askubuntu.com/questions/147241/execute-sudo-without-password
Дейв

10

Рішення в цьому блозі для мене спрацювало дуже добре: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

В основному:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

Перший рядок дозволяє вводити інтерактивний пароль, не показуючи пароль на екрані. Підходить для мене на Ubuntu 9.04.


1
Для цього потрібно можливість tty_tickets бути знята з охорони: !tty_tickets.
синенький

2
Як щодо ssh -t [other options]замість того, щоб грати stty -echo?
Іван Вучиця

Я свою справу вже зняв: tty_ticketsвсе одно ... тому я можу спробувати цей підхід.
MountainX

1
sudo: no tty present and no askpass program specified
Майкл

Як один невстановлений tty_tickets? На якій машині? Під час цієї команди rsync?
Джонатан

4

Вам потрібен метод подання пароля sudo. askpassПрограма призначена , щоб попросити паролі , коли звичайні механізми не доступні. Налаштування, sudoщоб не потрібно було запускати пароль, rsyncоскільки ваш userid - це один із варіантів.

Я зазвичай налаштовую вхід на основі ключа з відповідними обмеженнями для таких випадків. Якщо ви налаштовуєте обмежений ключ, який виконується лише rsyncяк root, то подібні речі зробити простіше. Інша альтернатива - використовувати rsycndпроцес для обробки віддалених запитів. Конфігурація забезпечує різноманітні обмеження, які можна застосувати.

РЕДАКТУВАННЯ: Я включив сценарій налаштування ключів для ключів на основі ключів у розділі Створення Userids для клієнтів моєї публікації про Налаштування BackupPC в Linux . Дивіться також документацію для ssh_config, в якій детально описуються деякі речі, які ви можете зробити при повторному використанні ключа, як показано в сценарії.


Дякую за вашу допомогу, але я знайшов рішення, яке краще працює для мене.
Пітер

будь-які подробиці про вхід на основі клавіш?
TheVillageIdiot

3

на віддаленій машині

sudo apt install ssh-askpass
which ssh-askpass

потім на локальній машині

rsync -av -e 'ssh -X' --rsync-path='SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass sudo -A rsync' /some/local/path user@remote:/some/remote/path

замінити шлях до ssh-askpass фактичним шляхом на віддаленій машині

джерело: http://unix.bris.ac.uk/2015/08/04/rsync-between-two-hosts-using-sudo-and-a-password-prompt/


2

Я вражений складністю існуючих відповідей. Це набагато простіше і зручніше налаштувати системи (ваш комп'ютер і віддалений хост) , так що ви можете підключити в якості кореня до віддаленого комп'ютера без використання пароля. І на відміну від зовнішнього вигляду це теж безпечно .

  1. На віддаленому хості переконайтеся, що / etc / ssh / sshd_config має цей рядок "PermitRootLogin without-password" (у багатьох дистрибутивах він є за замовчуванням). Це дозволяє root отримати оболонку ssh за допомогою будь-якого методу аутентифікації, окрім незахищеного запиту пароля.
  2. (Якщо ви ще не знаєте, як) дотримуйтесь будь-якого з багатьох навчальних посібників, як отримати вхід без пароля через ssh
  3. Використовуйте rsync так, як зазвичай, і без запитів пароля.

Тільки не забувайте, що доки рядок у /root/.ssh/authorized_keys віддаленого хоста існує, машина приймає кореневі команди з вашого ПК.


rrsync використовує такий підхід.
CODE-READ

0

Ось що для мене спрацювало, враховуючи, що я хочу зберігати автентифікацію пароля (тому я не хочу використовувати NOPASSWDабо ключі) - на Ubuntu 14.04:

  • "Відкрити" sudoна віддаленій машині, відключивши tty_ticketsчерез тимчасовий файл в /etc/sudoers.d/(який повинен підтримуватися на Debian, див. /etc/sudoers.d/README), Та "Оновити кешовані облікові дані користувача", що "продовжує час очікування sudo ще на 15 хвилин"
  • Виконайте rsyncз, sudoяк показано в інших відповідях
  • "Закрити" sudoна віддаленій машині, видаливши тимчасовий файл у /etc/sudoers.d/, який знову активуєтьсяtty_tickets

... або за допомогою командних рядків:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

Ось відповіді, які я отримую під час виконання цих команд на локальній машині:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

Зауважте, що їх sudo -vслід запускати після кожного /etc/sudoers.d/введення файлів , щоб зміни в ньому були прийняті.


0

Інший метод - це подолати обмеження дозволів, ініціюючи rsync на віддаленій машині. Замість:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

Ви можете зробити:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

Де y.y.y.yIP-адреса вашої локальної машини. Це працює лише в тому випадку, якщо ваша локальна машина може діяти як SSH-сервер.


1
Гм ... ви не скопіюєте локальний на віддалений у своєму першому командному рядку, а потім у другий командний рядок, який повинен бути еквівалентний першому, копіюючи віддалене в локальне (що не еквівалентно першому)?
sdaau

Ого! Виправлено це.
Кіт

0

Моє вирішення проблеми - додати --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

приклад:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

Зазвичай це не дуже гарна ідея вводити паролі в однорядний командний рядок; вони стають видимими, наприклад, у дереві процесу. Я іноді замінюю фактичний пароль у цьому типі оператора на $ (cat my_password.txt), що трохи краще

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


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