28

Я хочу синхронизировать папку с моей машины с папкой на удаленной машине. Удаленной папкой можно манипулировать только пользователем 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

9 ответов9

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

Немного миссии!

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.

9

Попробуйте это решение. В вашем файле sudoers (/etc/sudoers) настройте своего пользователя следующим образом:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsync сообщает sudo что когда ваш пользователь запускает /usr/bin/rsync или просто rsync , пароль не требуется.

Тогда ваш оригинальный --rsync-path="sudo rsync" должен работать.

4

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

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

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

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/

1

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

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

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

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

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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .