如何让Expect脚本在SSH连接失败时抛出提示信息?
解决Expect脚本SSH连接失败无提示问题
你的脚本仅匹配了密码提示和一个可能错误的send:字符串,未覆盖实际连接失败的常见场景(如连接拒绝、超时、无路由等),同时缺少空行处理和超时事件响应,导致无法输出失败提示。
关键修改点:
- 新增对SSH连接失败常见提示的匹配(如
Connection refused、No route to host) - 处理Expect超时事件,避免脚本卡住
- 跳过主机列表中的空行,减少无效操作
- 给失败提示加上服务器IP标识,方便定位问题
- 正确关闭文件句柄和spawn进程,避免资源泄漏
修改后的脚本:
#!/usr/bin/expect # 与SSH的ConnectTimeout保持一致,设置合理超时时间 set timeout 10 set hostlist [open ./ddlicall.txt] set ipaddrs [read $hostlist] close $hostlist ;# 读完文件后及时关闭 foreach line [split $ipaddrs \n] { # 跳过空行,避免无效连接尝试 if {$line eq ""} { continue } puts "\n=== 正在连接服务器: $line ===" spawn ssh -o ConnectTimeout=10 -o LogLevel=quiet sysadmin@$line expect { "assword:" { send "MY-PASSWORD\r" expect { "sysadmin@" { send "elicense license-server show\r" expect "sysadmin@" send "exit\r" expect eof } "assword:" { send \x03 puts "\n[ $line ] 密码错误,跳过当前服务器\n" expect eof } "Permission denied" { puts "\n[ $line ] 权限拒绝,可能密码错误或无访问权限\n" expect eof } } } "Connection refused" { puts "\n[ $line ] 连接被拒绝,可能服务器未开启SSH或端口错误\n" expect eof } "No route to host" { puts "\n[ $line ] 无路由到主机,可能网络不通或IP错误\n" expect eof } timeout { puts "\n[ $line ] 连接超时,可能网络延迟或服务器未响应\n" send \x03 ;# 终止当前连接进程 expect eof } eof { puts "\n[ $line ] 连接意外中断\n" } } }
内容的提问来源于stack exchange,提问作者non_nomen
相关产品推荐
相关产品推荐

