我正在努力解决在 ssh 中自动输入密码的经典问题,并且像其他所有人一样,我在期待中跌跌撞撞。最后,我拼凑了一个可行的脚本:
#!/usr/bin/expect -f
# command line args
set user_at_host [lrange $argv 0 0]
set password [lrange $argv 1 1]
set timeout 1
# ssh command
spawn ssh -S ~/.ssh/tmp.$user_at_host -M -N -f $user_at_host
# deal with ssh prompts
expect {
"*yes/no*" { send "yes\r" ; exp_continue }
"*assword:" { send "$password\r" ; exp_continue }
}
该脚本仅由于该timeout 1
行而终止,没有它它只是挂起,并且仅通过用户交互(^C
)终止。
当该spawn
行是直接的 ssh 命令时,脚本会立即终止,但这不是您的直接 ssh。可能不同的是-f
使它在后台运行的选项(但我尝试了没有它的脚本无济于事)。
我读过interact
或者expect eof
可能会有所帮助,但我无法找到真正能做到的正确咒语。
我的问题(我认为)是如何制作一个期望脚本,它产生一个后台进程,在没有超时的情况下终止?
编辑:我应该预料到(没有双关语)“使用无密码 ssh 身份验证”的答案。虽然这是一个合理的建议,但在我的场景中它不是合适的解决方案:在受信任的环境中自动测试 vanilla 安装的系统,在该环境中向图像添加受信任的密钥是不可取的/不可能的。