Expect脚本中Socat连接思科交换机后expect命令不生效如何解决?
问题根因
你当前的脚本直接执行socat.exe命令时,socat会作为前台阻塞进程运行,脚本控制权会被socat完全占用,后续的send、expect等交互指令不会被执行。
修复方案
Expect 控制外部进程交互必须通过spawn关键字启动目标进程,才能接管进程的输入输出流执行后续交互逻辑,修正后的脚本如下:
#!/usr/bin/expect -f # 设置全局超时时间30秒,避免串口响应慢导致匹配失败 set timeout 30 # 用spawn启动socat进程,expect接管交互 spawn socat.exe `tty`,raw,echo=0 /dev/ttyS4,raw,echo=0,sane # 串口初始化等待时间调整为1秒,原10毫秒过短无法完成初始化 after 1000 send "\r" expect "*switch1>" send "enable\r" expect "*assword:" send "PASSWORD\r" expect "*#" send "sh ip int brief\r" # 执行完命令后可以加expect等待输出,避免脚本直接退出 expect "*#" send "exit\r"
额外调整说明
- 移除了socat参数中的
setsid,避免进程脱离当前会话导致expect无法接管 - 放宽了提示符的匹配规则,开头加了
*通配符,适配串口输出可能存在的前置乱码、空行等情况 - 最后增加了执行完命令后的匹配逻辑,避免脚本在命令输出完成前提前终止
内容的提问来源于stack exchange,提问作者DeathS7roke
相关产品推荐
相关产品推荐

