Expect脚本自动发送响应失效问题求助
Expect脚本自动发送响应失效问题求助
Hey there,看了你的脚本和调试输出,我发现问题出在对SSH连接时的提示判断上,咱们一步步捋清楚:
首先看你的调试日志,脚本一直在重复匹配*(RSA) to the list of known hosts.*这个模式,然后发送yes\r,陷入了循环——但实际上这个提示是SSH已经自动把主机添加到known_hosts列表的警告信息,根本不需要你回复yes!真正需要回复yes的是第一次连接时的询问:Are you sure you want to continue connecting (yes/no)?,你的脚本完全搞混了这两种提示。
因为脚本一直在处理这个不需要回复的警告,导致它根本没机会去匹配后面的Ticketing system (JIRA or SNOW):提示,直到超时之后,这个提示才出现,但脚本已经停止等待了。
修正后的脚本
#!/usr/bin/expect -f set server_ip "<server>" spawn ssh -A $server_ip expect { # 只匹配真正需要确认的添加主机提示 "*Are you sure you want to continue connecting (yes/no)?*" { send "yes\r" exp_continue # 继续等待后续提示 } # 忽略已添加主机的警告信息,直接继续等待 "*Permanently added '*' (RSA) to the list of known hosts.*" { exp_continue } # 匹配票务系统的询问 "*Ticketing system (JIRA or SNOW):*" { send "JIRA\r" } } interact
为什么这样改?
- 咱们把匹配目标改成了真正需要用户确认的
Are you sure...提示,只有这个时候才需要发送yes。 - 对于那个已添加主机的警告,我们只做
exp_continue,不发送任何内容,让脚本直接跳过这个信息,继续等待后面的票务系统询问。 - 这样脚本就不会陷入无效的循环,能正常匹配到你需要处理的Ticketing提示并发送响应。
你可以用expect -d再运行一遍修正后的脚本,看看调试日志,应该就能正常走到发送JIRA的步骤了。
备注:内容来源于stack exchange,提问作者Sreekanth Chityala
相关产品推荐
相关产品推荐

