使用expect命令时添加花括号为何会出现超时问题?
问题原因及解决方案
你的脚本超时问题核心出在正则表达式的严格锚定与多分支expect的匹配逻辑差异上,具体分析和解决方法如下:
核心原因
单模式expect -re "^Password:$"会持续等待缓冲区中出现完全匹配的行,且会自动忽略缓冲区中之前的无关输出(比如SSH登录的banner信息);但多分支expect会在每次有新输入时检查所有模式,若你的Cisco交换机实际输出的Password:提示行并非严格以Password:开头并结尾(比如行首有不可见的回车/空格、或者带有ANSI格式转义字符),严格的^(行首锚定)和$(行尾锚定)就会匹配失败,最终触发超时分支。
另外注意检查第二个脚本的shebang行是否正确,必须是#!/usr/bin/expect,少了#会导致脚本无法被正确的解释器执行。
修复方案
方案1:简化正则表达式(推荐)
去掉严格锚定符,直接匹配Password:字符串即可——在SSH登录场景中,这个提示是唯一的,无需严格锚定:
#!/usr/bin/expect set timeout 60 spawn ssh admin@[lindex $argv 0] expect { -re "Password:" {send -- "admin\r"} timeout {puts "took too much time"; exit} eof {puts "finished in time"} } interact
方案2:兼容行首/行尾的空白字符
如果需要保留锚定逻辑,可调整正则允许行首/行尾存在空白字符(包括空格、制表符、回车):
#!/usr/bin/expect set timeout 60 spawn ssh admin@[lindex $argv 0] expect { -re "^\\s*Password:\\s*$" {send -- "admin\r"} timeout {puts "took too much time"; exit} eof {puts "finished in time"} } interact
内容的提问来源于stack exchange,提问作者abinjacob
相关产品推荐
相关产品推荐

