![系统之间 rsync 根文件无需指定密码](https://linux22.com/image/1366274/%E7%B3%BB%E7%BB%9F%E4%B9%8B%E9%97%B4%20rsync%20%E6%A0%B9%E6%96%87%E4%BB%B6%E6%97%A0%E9%9C%80%E6%8C%87%E5%AE%9A%E5%AF%86%E7%A0%81.png)
我觉得这很棘手。
我已经设置了两个系统,这样我就可以rsync
以我的身份在它们之间传输文件,而无需指定密码。现在的问题是属于rsync
的文件root
。在我的两个系统上,都没有 root 密码。成为 root 的唯一方法是通过sudo
。所以我既不能为提供密码sudo rsyn local root@remote:
,也不能使用我的 ssh-agent 提供密码。我不想在任何系统上设置 root 密码;我确实需要文件在两个系统上都归 root 所有。
编辑:使用所属文件root
只是一个例子,我需要一种方法让我的非特权帐户能够轻松地读取/写入系统(包括 root 拥有的)文件。一个例子是将我配置的 /root 环境复制到新安装的系统中。这两个系统实际上是单个主机下的两个 VM,因此在它们之间复制 root 拥有的文件对我来说并不是什么大问题。
编辑2:如果我只想将配置的 /root 环境复制到新安装的系统中,我可以使用 tar:
sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /
但我确实需要rsync
时不时地更新。有什么简单的方法可以实现吗?
编辑 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”不会要求输入密码。这可以通过多种方式实现:
- 在运行 rsync 之前在远程执行
sudo -v
(适用于一次性 rsync 作业)。tty_tickets
要使此功能有效,您的 sudo 不得使用选项。 - 放入远程
username ALL= NOPASSWD:/usr/bin/rsync
主机/etc/sudoers
。 - 使用pam-ssh-代理认证远程
/etc/pam.d/sudo
当然,您也可以不使用“通过 ssh 进行 rsync”,而是使用“守护进程模式下的 rsync”(例如,参见 Debian GNU/Linux 上的 )来完成您想要的操作,同时还能获得更快的传输速度rsyncd.conf(5)
。/etc/default/rsync
答案2
解决方案。
- 将用户的 ssh 密钥添加到远程 root 是可行的,但只成功了一半,也就是说,现在
rsyn ... root@remote:...
成功了。具有挑战性的部分是让sudo rsyn ...
工作也顺利进行。 - 为了开始
sudo rsyn ...
工作,需要的是——使用 SSH 代理进行 sudo 身份验证,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/ - 要在 Ubuntu 下安装 pam-ssh-agent-auth PAM 模块,可以使用我刚刚构建的 ppa,https://launchpad.net/~suntong001/+archive/ppa。在 Ubuntu 12.04 precise 和 13.10 saucy 下测试良好。
高血压
答案3
另一种方法是在两台服务器上创建一个包含 rsync 脚本的 .sh 脚本。
然后通过 cronjob 或 ssh 运行它们:
ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh
或者直接通过 ssh 运行 rsync 脚本
ssh not-your-root-user@remoteserver sudo rsync local root@remote
如果它是一个计划的 rsync 作业,我更喜欢 cronjob。
答案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
该选项强制 tty 分配并且对于在远程系统上
-t
运行命令是必要的。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
。
为了使此操作无需密码即可运行,您必须以 root 身份运行ssh-keygen
,ssh-copy-id
正如我在一开始所述。您仍然需要为这两个sudo
命令输入密码,一个用于本地计算机,一个用于远程计算机。