我想将远程计算机上的目录
/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命令来完成这个文件同步?我想避免更改任何其他内容(例如,不更改文件权限或 ssh 设置)
试试这个:
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
),因此 ssh
命令可以访问必要的凭据。 Rsync 本身仍然以 root 身份运行,因此它具有必要的文件系统权限。
只是在 larsks 的回应之上进行改进:
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/
。
关于@larsks的回答,如果您将密钥加载到ssh代理中(这是我的用例),您可以这样做:
sudo rsync -e "env SSH_AUTH_SOCK=$SSH_AUTH_SOCK ssh" /source/path /destination/path
而不是双
sudo
。
如果有人对复制感兴趣,我的用例是我通过 SSH 连接到远程 A 上的非 root sudo-er 帐户,并且需要在远程 A 和远程 B 之间 rsync root 拥有的文件。对两个远程的身份验证是使用我在真实本地计算机上拥有的密钥完成的,并且我使用
-A
将 ssh-agent 身份验证套接字转发到远程 A。
sudo rsync
获取本地文件权限但又想利用用户的 SSH 会话,
Guss 的答案效果很好。然而,当您还想使用 SSH 配置文件时,它就显得不够了。
您可以遵循 Wernight 的方法,使用
sudo
切换 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
命令级联此标志,因此它看起来确实有点混乱!
根据上面Derek的要求:
当 sudo 要求输入密码时,您需要使用
sudo visudo
修改 sudoers 配置,并在 rsync 命令前面添加带有 NOPASSWD:
的条目。
详情可以咨询
man sudoers
。
这将在每种模式下工作,甚至通过 cron、at、systemd.service+timer 等。
测试它:
ssh <user>@<your-server> "sudo <your-rsync-command>"