You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:05:37