Rsync корневые файлы между системами без указания пароля

Rsync корневые файлы между системами без указания пароля

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

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

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

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

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

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

EDIT 3: Формально сформулируйте вопрос

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

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

Спасибо

решение1

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

rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/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 через ssh» использовать «rsync в режиме демона» (см. rsyncd.conf(5)и /etc/default/rsyncв Debian GNU/Linux, например), чтобы добиться желаемого, с дополнительным преимуществом в виде более высокой скорости передачи.

решение2

Решение.

  1. Добавление ключа ssh пользователя к удаленному root работает, но только наполовину, т. е. теперь 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 exact и 13.10 saucy.

НТН

решение3

Другой способ — создать на обоих серверах скрипт .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.

решение4

Ну, это зависит от того, что вы хотите сделать. Должны ли файлы принадлежать пользователю 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команд, один раз для вашей локальной машины и один раз для удаленной.

Связанный контент