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

如何在Expect脚本中仅提取目标响应输出并自动退出?

如何在Expect脚本中仅提取目标响应输出并自动退出?

我来帮你搞定这个问题!你现在的脚本要么卡着不退出(用interact的情况),要么退出去就看不到响应,核心问题有两个:一是没等设备返回响应就直接退出了,二是默认的日志输出会把spawn、Trying这些过程信息都打出来。

给你两个解决方案,按需选择:

方案一:精确匹配响应+仅输出目标内容

这个方案会精准捕获设备返回的"on",去掉引号后输出,同时自动退出:

#!/usr/bin/expect -f

# 关闭冗余的过程日志(不显示spawn、Trying这些无关信息)
log_user 0

# 启动telnet连接
spawn telnet 10.92.177.14 53595

# 等待设备返回的"NOKEY"提示符
expect -exact "NOKEY"

# 发送查询命令,记得加换行符\r
send "power_status ?\r"

# 等待目标响应,用正则分组提取引号里的内容
expect -re {"([^"]+)"} {
    # 提取引号内的核心内容(也就是on)并输出
    puts $expect_out(1,string)
    # 主动关闭telnet连接
    close
    # 退出脚本
    exit 0
}

# 可选:处理超时异常(比如设备没响应的情况)
expect timeout {
    puts "Error: 等待响应超时"
    exit 1
}

关键逻辑说明:

  1. log_user 0:这行是关键,它会关闭Expect默认的日志输出,把spawn、Trying、Connected这些无关信息全部隐藏。
  2. expect -re {"([^"]+)"}:用正则表达式匹配带引号的响应,其中([^"]+)会捕获引号中间的所有内容(也就是我们要的on),存到$expect_out(1,string)里。
  3. 拿到结果后用close关闭telnet连接,exit直接退出脚本,不会停留在交互状态。

方案二:简化版(快速适配你的原有脚本)

如果不想写正则,也可以直接匹配带引号的"on",再去掉引号输出:

#!/usr/bin/expect -f

log_user 0

spawn telnet 10.92.177.14 53595

expect "NOKEY"

send "power_status ?\r"

# 直接匹配完整的"on"响应
expect "\"on\"" {
    # 去掉前后的引号,只输出on
    puts [string trim $expect_out(0,string) "\""]
    close
    exit
}

为什么原来的脚本有问题?

  • 你之前去掉interact后脚本直接退出,是因为send命令执行完后,脚本没有等待设备返回响应就结束了,自然看不到结果。
  • 保留interact会让脚本进入手动交互模式,所以会一直保持连接不退出。

备注:内容来源于stack exchange,提问作者Elliott B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:30:30