Expect正则表达式无法匹配部分Shell提示符,求通用匹配方案
匹配所有Shell提示符的Expect正则表达式解决方案
你的问题出在原正则仅匹配单个提示符符号,无法处理带前缀(如路径、用户名、Shell版本)的提示符,且容易误匹配输出中间的符号。结合你提供的expect -d调试输出,这里给出两种可靠的正则方案:
方案1:匹配带前缀的完整提示符行
这个正则兼容远程SSH的换行格式,能匹配所有带前缀的提示符场景:
set prompt {\r?\n.*[#>$%]\s*} expect -re $prompt
\r?\n:适配Windows/Unix风格的换行(远程连接输出常带\r).*:匹配提示符前的任意前缀(如/home/user1、root、bash-4)[#>$%]:覆盖常见的Shell提示符符号\s*:匹配符号后可能存在的空格(多数Shell提示符符号后会带空格)
方案2:锚定输出结尾的精确匹配
如果需要避免误匹配输出中间的符号(比如内容里包含$字符的情况),可以用锚定正则确保匹配的是输出末尾的提示符:
set prompt {.*[#>$%]\s*$} expect -re $prompt
$:锚定到buffer结尾,仅匹配最后出现的提示符符号
针对你调试输出的问题分析
从expect -d日志可见,修改密码成功后,系统先输出Passwd successfully changed,再出现bash-4.3$提示符,但原正则仅匹配单个符号,未能识别新行后的完整提示符,导致超时。使用上述方案后,Expect会等待到包含提示符的完整行出现,解决超时问题。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

