我想将目录/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设置)
答案 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。