Expect脚本中密码提示场景send命令失效问题求助
解决Expect脚本密码匹配后Send失效的问题
我来帮你搞定这个问题~你遇到的核心问题大概率是语法错误,加上可能的匹配模式小问题,导致send命令没有被正确执行。
先看你写的代码:
expect -re "Engine admin password:" send -- "$pass\r"
在Tcl(Expect基于Tcl)里,命令之间必须用换行、分号或者大括号来分隔,你把expect和send挤在同一行又没加分隔符,Tcl会把send当成expect命令的无效参数,根本不会执行发送密码的动作!
正确的写法示例
下面给你几个可行的修正版本,选一个你习惯的就行:
1. 换行分隔命令(最清晰)
# 用精确匹配代替正则,避免不必要的正则匹配问题 expect -ex "Engine admin password:" # 发送密码,--用来防止密码以-开头时被当成命令选项 send -- "$pass\r"
2. 同一行加分号分隔
expect -ex "Engine admin password:" ; send -- "$pass\r"
3. 用大括号包裹动作(紧凑写法)
expect -ex "Engine admin password:" { send -- "$pass\r" }
额外排查点
如果修正语法后还是不行,试试这两个方向:
- 检查提示是否有隐藏字符:有时候密码提示后面会跟着空格、制表符或者回车,你可以用正则匹配这些空白字符,确保捕获到完整提示:
expect -re "Engine admin password:\\s*" send -- "$pass\r" - 等待后续提示符:发送密码后,脚本需要等待下一个可识别的提示符(比如命令行的
#、$或者系统的下一步提示)才能继续执行,别忘了加这一步:expect -ex "Engine admin password:" send -- "$pass\r" # 假设下一步的提示符是#,根据你的实际情况修改 expect "# "
内容的提问来源于stack exchange,提问作者Jonoca
相关产品推荐
相关产品推荐

