系统之间 rsync 根文件无需指定密码

系统之间 rsync 根文件无需指定密码

我觉得这很棘手。

我已经设置了两个系统,这样我就可以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 的文件,而无需指定密码,条件是,

  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”不会要求输入密码。这可以通过多种方式实现:

  • 在运行 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

解决方案。

  1. 将用户的 ssh 密钥添加到远程 root 是可行的,但只成功了一半,也就是说,现在rsyn ... root@remote:...成功了。具有挑战性的部分是让sudo rsyn ...工作也顺利进行。
  2. 为了开始sudo rsyn ...工作,需要的是——使用 SSH 代理进行 sudo 身份验证,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. 要在 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

您现在应该能够执行无密码操作sshrsync(以 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
    

    该选项强制 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-keygenssh-copy-id正如我在一开始所述。您仍然需要为这两个sudo命令输入密码,一个用于本地计算机,一个用于远程计算机。

相关内容