我正在尝试编写一个脚本,将网站推送到我的服务器,网站文件位于我的本地机器上以供测试。
现在它可以工作了,通过使用rsync
更新服务器,然后ssh
让服务器运行执行一些操作的脚本(即重新启动 apache - 该网站使用 WSGI)。
问题是我必须输入两次服务器密码,我并不喜欢这样。
有没有办法让我只需输入一次密码?我并不特别想完全不输入密码,所以我想有某种不输入密码的方法ssh-key
。
答案1
查找中的-M
和-S
选项ssh(1)
。其思路是打开与服务器的主连接,然后通过打开的套接字以从属连接的形式进行多次访问。另请参阅手册中的ControlMaster
和。ControlPath
ssh_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