Expect脚本读取文本值循环执行Cisco AP重启命令报错如何解决
问题根因分析
报错send: spawn id exp6 not open的核心原因是循环体内部提前关闭了SSH连接:
你在foreach循环的每一轮结尾都写了expect eof和close,第一次执行完第一个AP的重启操作后,这两行会直接终止当前SSH会话、释放spawn生成的进程ID,第二轮循环要发送config ap reset命令时,已经没有存活的SSH连接,所以直接抛出spawn ID不存在的错误。
修复方案
你需要删除循环里的expect eof和close语句,同时优化几个容易触发异常的点:
- 所有AP操作完成后再执行登出逻辑,不要在循环内销毁SSH连接
- 读取AP列表时过滤空行,避免文本末尾的空值执行无效命令
- 每轮操作后匹配控制器的提示符
*>,确保上一条命令执行完成再进入下一轮循环 - 统一命令后的换行符,思科无线控制器用
\r(回车)兼容性更好
修复后的核心循环代码示例
foreach ap $aps { # 跳过空行 if {$ap eq ""} { continue } send "config ap reset $ap\r" expect { "*n)" {send "y\r"} "*invalid." {send "\r"} timeout {send_user "重启$ap超时,已跳过\r"} } # 等待回到提示符再执行下一个操作 expect "*>" } # 所有AP处理完成后再登出 send "\r" expect "*>" send "logout\r" expect "*(y/N)" send "n\r" exit
可选优化点
- 可以给每个AP的重启操作设置单独的超时时间,避免单个AP执行卡住影响整个脚本
- 可以添加日志打印每个AP的执行结果,方便后续排查哪些AP重启成功、哪些执行失败
内容的提问来源于stack exchange,提问作者William K
相关产品推荐
相关产品推荐

