如何在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 }
关键逻辑说明:
log_user 0:这行是关键,它会关闭Expect默认的日志输出,把spawn、Trying、Connected这些无关信息全部隐藏。expect -re {"([^"]+)"}:用正则表达式匹配带引号的响应,其中([^"]+)会捕获引号中间的所有内容(也就是我们要的on),存到$expect_out(1,string)里。- 拿到结果后用
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
相关产品推荐
相关产品推荐

