对于使用 rsync 和 SSH 的脚本,只需输入一次密码

对于使用 rsync 和 SSH 的脚本,只需输入一次密码

我正在尝试编写一个脚本,将网站推送到我的服务器,网站文件位于我的本地机器上以供测试。

现在它可以工作了,通过使用rsync更新服务器,然后ssh让服务器运行执行一些操作的脚本(即重新启动 apache - 该网站使用 WSGI)。

问题是我必须输入两次服务器密码,我并不喜欢这样。

有没有办法让我只需输入一次密码?我并不特别想完全不输入密码,所以我想有某种不输入密码的方法ssh-key

答案1

查找中的-M-S选项ssh(1)。其思路是打开与服务器的主连接,然后通过打开的套接字以从属连接的形式进行多次访问。另请参阅手册中的ControlMaster和。ControlPathssh_config(5)

答案2

我们学校也有类似的复杂设置,要求用户使用密码登录。

最终我了解到expect可以实现自动化。

就我而言,我使程序变得有点难以阅读,以便密码不会明显可见。

无论如何,我发现的第一个可读性好的例子是这里

#!/usr/local/bin/expect
spawn  sftp  -b cmdFile [email protected]
expect "password:"
send "shhh!\n"; 

其目的是完全重现手动登录的过程。因此,您需要事先知道脚本会遇到哪些“问题”以及应该如何回答。

在我的例子中,命令是

spawn  ssh [email protected]

将字符串替换expect为您所见的情况 – 并输入所需的答复。

例如,如果您必须输入两次密码 - 请添加另一个

expect "password:"
send "my_super_secret_password\n"; 

不要忘记添加将您的网站放入脚本中的命令;)它看起来像:

expect "prompt:"
send "update my website\n"

答案3

你可以找到类似的问题和另一个描述性答案这里

为了以防万一有帮助,我rsync按照 Kusalananda 的建议,用两个不同的流程制作了这个通用脚本:

#!/usr/bin/env bash

REMOTEUSER=username
REMOTEHOST=hostname

mkdir -P ~/.ssh/ctl
ssh -nNf -o ControlMaster=yes -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir01/ $REMOTEUSER@$REMOTEHOST:/remotedir01/

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir02/ $REMOTEUSER@$REMOTEHOST:/remotedir02/

ssh -O exit -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

相关内容