rsync远程文件通过SSH连接到我的本地计算机,使用本地端的sudo权限和我的个人SSH密钥

时间:2014-02-07 23:56:09

标签: ssh rsync

我想将目录/var/sites/example.net/从远程计算机同步到本地计算机上相同路径的目录。

远程计算机仅使用密钥而非密码验证SSH连接。

在我的本地计算机上,我在〜/ .ssh / config中设置了一个别名,以便我可以轻松运行ssh myserver进入。

我正在尝试rsync -a myserver:/var/sites/example.net/ /var/sites/example.net/但它失败了,因为我的本地用户无权编辑本地目录/var/sites/example.net/。

如果我尝试sudo rsync -a myserver:/var/sites/example.net/ /var/sites/example.net/(只是添加sudo),我可以解决本地权限问题,但后来遇到了另一个问题 - 我的本地root用户没有看到正确的ssh密钥或ssh别名。

有没有办法通过修改此rsync命令来完成此文件同步?我想避免更改任何其他内容(例如,不更改文件perms或ssh设置)

5 个答案:

答案 0 :(得分:8)

试试这个:

sudo rsync -e "sudo -u localuser ssh" -a myserver:/var/sites/example.net/ /var/sites/example.net/

这会以root身份运行rsync,但-e标记会导致rsync作为您的本地用户(使用ssh)运行sudo -u localuser,因此{ {1}}命令可以访问必要的凭据。 Rsync本身仍以root身份运行,因此它具有必要的文件系统权限。

答案 1 :(得分:1)

只需改进larsks's response

sudo rsync -e "sudo -u $USER ssh" ...

因此,在您的情况下,将rsync -a myserver:/var/sites/example.net/ /var/sites/example.net/更改为sudo rsync -e "sudo -u $USER ssh" -a myserver:/var/sites/example.net/ /var/sites/example.net/

答案 2 :(得分:1)

如果要使用sudo rsync来获取本地文件权限,但又想利用用户的SSH会话,则

Guss's answer会很好用。但是,当您还想使用SSH配置文件时,它就不够用了。

您可以通过使用sudo来切换Wernight's approach,方法是切换用户以进行SSH连接并提供配置文件的路径,但是如果必须输入密码,此操作将无效。因此,您可以使用--preserve-env标志来结合两种方法:

sudo --preserve-env=SSH_AUTH_SOCK rsync -e "sudo --preserve-env=SSH_AUTH_SOCK -u $USER ssh" hostname:/source/path /destination/path

请注意,有必要通过两个sudo命令来级联此标志,这样看起来确实有些混乱!

答案 3 :(得分:0)

根据Derek above的要求:

当sudo要求输入密码时,您需要使用"hello"修改sudoers配置,并在rsync命令之前使用<soap:Fault> <faultcode>soap:5</faultcode> <faultstring>cvc-complex-type.2.3: Element 'requestHeader' cannot have character [children], because the type's content type is element-only.</faultstring> </soap:Fault> 添加一个条目。

有关详细信息,您可以咨询sudo visudo

这将在每种模式下都有效,即使通过cron,at,systemd.service + timer等也是如此。

使用NOPASSWD:

进行测试

答案 4 :(得分:0)

关于@larsks的回答,如果您将密钥加载到ssh代理中(这是我的用例),则可以执行以下操作:

sudo rsync -e "env SSH_AUTH_SOCK=$SSH_AUTH_SOCK ssh" /source/path /destination/path

代替双sudo

如果有人对复制感兴趣,我的用例是我正在SSH到远程A上的非根sudo-er帐户,并且需要在远程A和远程B之间rsync拥有根文件。这两个遥控器都是使用我真正的本地计算机上的密钥完成的,并且我使用-A将ssh-agent身份验证套接字转发到远程A。