![从脚本执行 rsync 命令,无需输入密码](https://linux22.com/image/722225/%E4%BB%8E%E8%84%9A%E6%9C%AC%E6%89%A7%E8%A1%8C%20rsync%20%E5%91%BD%E4%BB%A4%EF%BC%8C%E6%97%A0%E9%9C%80%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81.png)
我使用 rsync 将代码部署到远程服务器,目前我有安全密钥的密码。如何在 rsync 命令中添加密码而不提示在脚本中使用它?
我不使用 rsync-daemon。
我的命令:
rsync -vaz -e "ssh -i /root/.ssh/key.ppk" --chmod=ugo=rwX --omit-dir-times --no-perms . [email protected]:/var/www/html
答案1
通过限制服务器端密钥的使用,使您的安全性不受私钥密码的影响:
- 创建仅用于 rsync 的单独密钥对。使该私钥无密码。
- 在服务器上,确保您有
rrsync
可用的脚本。(它通常会与 rsync 包一起安装,可能在 中)/usr/share/doc/rsync-VERSION/support
。 - 将密钥的公共部分添加到服务器上目标用户的 authorized_keys 中。在行的开头,添加一系列限制,以强制密钥只能从正确的服务器使用,并且只能将内容 rsync 到特定目录,如下所示:
命令“/path/to/rrsync /var/www/html/”,no-pty,no-port-forwarding,no-user-rc,no-X11-forwarding,no-agent-forwarding,来自“IPADRESS” ssh-rsa AAA[...]
现在您拥有的密钥只能用于一件事 - 将内容从一台服务器 rsync 到目录 /var/www/html。服务器端的限制意味着即使其他人掌握了密钥,他们所能造成的破坏也非常有限,而且肯定比他们掌握允许完全访问的密钥的密码要少得多。
答案2
您可以将 ssh 密钥与密码一起保存在磁盘上,并在主机启动时将密钥解锁到 ssh 代理中。
然后,在运行 rsync 时,确保设置了正确的环境变量以允许使用代理。
启动时手动:
ssh-agent >$HOME/.ssh/agent_env # will start a new ssh agent and store the details
. $HOME/.ssh/agent_env # will load the stored environment into this shell
ssh-add $HOME/.ssh/key.ppk # will prompt for passphrase
然后在运行 rsync 时,使用一个小的包装脚本来获取agent_env
文件,如上所述:
#!/bin/sh
if [ ! -e $HOME/.ssh/agent_env ]
then
No ssh agent details
exit 1
fi
. $HOME/.ssh/agent_env
rsync ...
为了确保万无一失,请@reboot
为 root 用户设置一个 cron 作业来删除该$HOME/.ssh/agent_env
文件:
@reboot rm $HOME/.ssh/agent_env
答案3
您是说您在远程服务器上安装了需要密码的公钥(即由 ssh keygen 进程创建的 RSA 密钥)?
如果是的话,您是否尝试过这两种技术?
- 将环境变量 RSYNC_PASSWORD 设置为密码(其他用户可以看到)。
- 在命令行 --password-file 选项中指定。只要密码文件不是所有人都可读的,此选项就更安全。
当您尝试这样做时,输出结果会是什么样的?我有一位同事在他的职业生涯中编写了很多这样的脚本,所以我可以问他是否有您所看到的示例。
让我知道。