2

Это кажется мне очень сложным.

Я настроил две мои системы так, чтобы я мог rsync файлы между ними, как я, без указания пароля. Теперь проблема в том, чтобы rsync файлы, которые принадлежат пользователю root . В обеих моих системах нет корневых паролей. Единственный способ получить root - через sudo . Поэтому я не могу ни дать пароль для sudo rsyn local root@remote: не использовать мой ssh-agent для предоставления парольной фразы. Я не хочу устанавливать пароль root ни в каких системах; и мне нужно, чтобы файлы принадлежали пользователю root в обеих системах.

РЕДАКТИРОВАТЬ: Использование файлов, принадлежащих пользователю root является лишь примером, мне нужен способ для моей непривилегированной учетной записи легко читать / записывать системные файлы (в том числе принадлежащие пользователю root). Одним из примеров является копирование моей настроенной / корневой среды в только что установленную систему. Эти две системы на самом деле представляют собой две виртуальные машины под одним хостом, поэтому для меня нет особой необходимости копировать файлы, принадлежащие корню, между ними.

РЕДАКТИРОВАТЬ 2: Если я только хочу скопировать настроенную / корневую среду в только что установленную систему, я могу использовать tar:

sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /

Но мне нужно время от времени обновлять rsync . Есть ли простой способ сделать это?

РЕДАКТИРОВАТЬ 3: Формально сформулировать вопрос

Хорошо, все началось с вопроса, как rsync файлы, принадлежащие root между двумя системами, как обычный непривилегированный пользователь, без указания пароля, при условии, что

  1. Учетная запись root заблокирована в обеих системах. Т.е. нет root паролей. Единственный способ получить root - через sudo (рекомендуемые правила безопасности см. Http://help.ubuntu.com/community/RootSudo).
  2. Я не хочу полностью лишенного паролей sudo но и не хочу постоянно вводить пароли.
  3. Обычный непривилегированный пользователь ввел свою парольную фразу ssh в агент ssh.

Спасибо

4 ответа4

2

Решение.

  1. Добавление пользовательского ключа ssh к удаленному корню работает, но только наполовину, т.е. теперь работает rsyn ... root@remote:... Сложной задачей является заставить sudo rsyn ... работать.
  2. Чтобы заставить sudo rsyn ... работать, нужно: использование SSH-агента для аутентификации sudo, http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. Чтобы установить PAM-модуль pam-ssh-agent-auth в Ubuntu, вы можете использовать только что созданный ppa , https://launchpad.net/~suntong001/+archive/ppa. Протестировано нормально под Ubuntu 12.04 точным, а 13.10 дерзким.

НТН

0

Вы можете сделать это напрямую с помощью rsync с помощью --rsync-path . Так что вы бы использовали:

rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ username@remote.example.com:/remotedir

Обратите внимание, что для этого требуется, чтобы "sudo rsync" на удаленном хосте НЕ запрашивал парольную фразу. Это может быть достигнуто несколькими способами:

  • выполнение sudo -v на удаленном компьютере перед запуском rsync (идеально для одноразовых заданий rsync). Ваше sudo не должно использовать опцию tty_tickets чтобы это работало.
  • размещение username ALL= NOPASSWD:/usr/bin/rsync в /etc/sudoers на удаленном хосте.
  • использование pam-ssh-agent-auth на удаленном компьютере для /etc/pam.d/sudo

Конечно, вы также можете вместо "rsync over ssh" использовать "rsync в режиме демона" (см., rsyncd.conf(5) и /etc/default/rsync в Debian GNU/Linux), чтобы выполнить то, что вы хотите, с помощью дополнительное преимущество лучшей скорости передачи.

0

Ну, это зависит от того, что вы хотите сделать. Должны ли файлы принадлежать пользователю root в обеих системах? Они не будут работать, если вы просто делаете резервную копию, поэтому вы можете просто запустить rsync от имени пользователя root, но войдите на удаленный сервер как обычный пользователь.

Создайте ключ для локального root чтобы войти в систему как удаленный обычный пользователь (я буду использовать xpt качестве имени вашего обычного пользователя):

sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote

Теперь вы должны быть в состоянии сделать ssh или rsync без пароля (как root) следующим образом:

rsync /path/to/local xpt@remote

Если в обеих системах файлы должны принадлежать пользователю root, все становится немного сложнее. Самое простое, что можно сделать, это просто установить пароль root в обеих системах:

sudo -i
passwd 

Теперь вы можете войти в систему как пользователь root.

Конечно, лучше всего не копировать файлы по сети как root. Я не могу себе представить, почему вы захотите, и риск не стоит усилий, просто скопируйте файлы и поиграйте с sudo мере необходимости после их копирования.


ОБНОВИТЬ:

Я повторяю, что самый простой способ сделать это - создать пароль root для каждой машины, а затем скопировать его как root. Я не понимаю, почему вы не хотите этого, это так же просто, как запустить sudo passwd .

В любом случае, если вы настаиваете на том, что не хотите создавать пароль root, единственный способ обойти это, как я вижу, - запустить две команды:

  1. Запустите rsync для копирования в каталог, доступный для записи пользователем (я использую mktmp для создания произвольного имени каталога):

    dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
    
  2. Переместить содержимое в remote:/root

    ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
    

    Опция -t форсирует распределение tty и необходима для запуска команд sudo в удаленной системе.

Вы можете объединить их, добавив это в файл ~/.bashrc (дайте мне знать, если вы не используете bash):

function Rrsync(){
    dir=`mktemp -u` &&
    sudo rsync -avz $1 $2:$dir &&
    ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}

Затем вы можете вызвать функцию следующим образом:

Rrsync /root xpt@remote /root
------ ----- ---------- -----
   |     |       |        |---> The target directory on the remote server
   |     |       |------------> username@server 
   |     |--------------------> Path to local source directory
   |--------------------------> The function name

Помните, что вам, возможно, придется поиграть с добавлением / удалением косой черты / из источника и целей rsync в зависимости от того, копируете ли вы каталог или его содержимое. Смотрите, man rsync .

Чтобы заставить это работать без пароля, вам нужно будет запустить ssh-keygen и ssh-copy-id от имени пользователя root, как я описал в самом начале. Вам все равно придется ввести пароль для двух команд sudo : один раз для локального компьютера, а второй - для удаленного.

0

Другой способ - создать сценарий .sh на обоих серверах, содержащий ваши сценарии rsync.

Затем запустите их через cronjob или через ssh:

ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh

Или просто запустите скрипт rsync напрямую через ssh

ssh not-your-root-user@remoteserver sudo rsync local root@remote

Я бы предпочел cronjob, если это запланированная работа rsync.

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