从脚本执行 rsync 命令,无需输入密码

从脚本执行 rsync 命令,无需输入密码

我使用 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

通过限制服务器端密钥的使用,使您的安全性不受私钥密码的影响:

  1. 创建仅用于 rsync 的单独密钥对。使该私钥无密码。
  2. 在服务器上,确保您有rrsync可用的脚本。(它通常会与 rsync 包一起安装,可能在 中)/usr/share/doc/rsync-VERSION/support
  3. 将密钥的公共部分添加到服务器上目标用户的 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 密钥)?

如果是的话,您是否尝试过这两种技术?

  1. 将环境变量 RSYNC_PASSWORD 设置为密码(其他用户可以看到)。
  2. 在命令行 --password-file 选项中指定。只要密码文件不是所有人都可读的,此选项就更安全。

当您尝试这样做时,输出结果会是什么样的?我有一位同事在他的职业生涯中编写了很多这样的脚本,所以我可以问他是否有您所看到的示例。

让我知道。

相关内容