
Мне это кажется очень сложным.
Я настроил свои две системы так, что могу 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, между двумя системами как обычный непривилегированный пользователь, не указывая пароль, при условии, что,
- Учетная
root
запись заблокирована на обеих системах. То есть паролей нетroot
. Единственный способ стать root — черезsudo
(рекомендуемая практика безопасности, см.http://help.ubuntu.com/community/RootSudo) - Я не хочу полностью отказаться от паролей
sudo
, но и вводить пароли постоянно не хочу. - Обычный непривилегированный пользователь ввел свою парольную фразу 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
Решение.
- Добавление ключа ssh пользователя к удаленному root работает, но только наполовину, т. е. теперь
rsyn ... root@remote:...
работает. Сложность заключается в том, чтобы получитьsudo rsyn ...
работу. - Чтобы все заработало
sudo rsyn ...
, нужно использовать SSH-агент для аутентификации sudo,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/ - Чтобы установить модуль 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, то единственный способ обойти это, который я вижу, — выполнить две команды:
Запустите
rsync
для копирования в доступный для записи пользователем каталог (я используюmktmp
для создания случайного имени каталога):dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
Переместить содержимое в
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
команд, один раз для вашей локальной машины и один раз для удаленной.