Запустите 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"должен работать.

dynabaul
источник
Я использовал параметр sudo rsync без указания имени пользователя ALL ... после завершения rsync. на пульте, когда я пытаюсь cd или ls. Я получил разрешение отказано. хотя я root. Я должен отдаться судьбе. но в случае 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). Test:, 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качестве вашего идентификатора пользователя, является одним из вариантов.

Я обычно настраиваю основанный на ключе вход в систему с соответствующими ограничениями для случаев как это. Если вы сконфигурируете ограниченный ключ, который запускается только rsyncот имени пользователя root, то подобные вещи станут проще. Другой альтернативой является использование rsycndпроцесса для обработки удаленных запросов. Конфигурация предоставляет множество ограничений, которые могут быть применены.

РЕДАКТИРОВАТЬ: я включил сценарий для настройки ключей для привязок на основе ключей в разделе «Создание идентификаторов пользователей на клиентах» моего поста « Настройка BackupPC в Linux» . Смотрите также документацию по ssh_config, в которой подробно описаны некоторые вещи, которые вы можете сделать с ограничением использования ключа, как показано в сценарии.

BillThor
источник
Спасибо за вашу помощь, но я нашел решение, которое работает лучше для меня.
Питер
какие-либо подробности о входе в систему на основе ключей?
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/

wotanii
источник
2

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

  1. На удаленном хосте убедитесь, что в / etc / ssh / sshd_config есть эта строка «PermitRootLogin без пароля» (во многих дистрибутивах она есть по умолчанию). Это позволяет root получить оболочку ssh, используя любой метод аутентификации, кроме запроса небезопасного пароля.
  2. (Если вы еще не знаете, как это сделать), следуйте любому из множества руководств по получению входа без пароля через ssh.
  3. Используйте rsync, как обычно, и без каких-либо запросов на ввод пароля.

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

ndemou
источник
Rrsync использует этот подход.
КОД-ЧТЕНИЕ
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/, чтобы изменения в них были приняты.

sdaau
источник
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.yнаходится IP-адрес вашей локальной машины? Это работает, только если ваша локальная машина может выступать в качестве сервера SSH.

Кит
источник
1
Хм ... не копируете ли вы local to remote в первую командную строку, а затем во вторую командную строку, которая должна быть эквивалентна первой, копировать remote в local (что не эквивалентно первой)?
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