Perl Net::Telnet连接华为MA5608T OLT出现提示符匹配超时问题求助
问题根因定位
核心触发原因
从Dump日志的十六进制交互数据可以直接定位错位点:设备实际返回的用户名提示字节序列最后到冒号(0x3a)就终止,即完整返回内容是>>User name:,根本不存在你正则规则里要求的“冒号后跟随一个空格”的结构。
你编写的匹配规则/>>User name: $/i,强制要求匹配“冒号+空格+行尾”的结构,和设备实际返回的字节完全错位,自然永远无法触发匹配。
机制层叠加问题
Net::Telnet 默认的行缓冲匹配逻辑,只有收到换行结束符(CRLF,0x0d0a)才会把缓冲内容标记为完整行送入正则匹配流程。但华为MA5608T的登录提示(>>User name:、>>User password:)是直接输出在行尾等待输入,不会在提示后追加换行结束符:
- 从Dump日志可验证,收到的提示内容前面只有一个前置换行(0d0a),提示本身后面没有任何换行字节
- 你之前尝试的所有正则都带了
$行尾锚点,本质是要求匹配完整行末尾,和设备无换行的提示机制冲突。哪怕去掉多余的空格要求,也会因为持续等待换行结束符、迟迟不满足行尾匹配条件触发超时。
已排除的异常点
日志开头的ff fb/ff fd字节是标准Telnet协议协商流程(终端回显、抑制前进字符协商),Net::Telnet已经正确完成协议交互,不存在协商失败、通信阻断类问题。
可直接落地的修复方案
- 修正登录阶段的匹配规则,去掉强制要求的尾随空格、删除登录提示匹配的
$行尾锚点:- 用户名匹配规则替换为
/>>User name:/i - 密码匹配规则替换为
/>>User password:/i
- 用户名匹配规则替换为
- 适当延长超时时间,原配置的5秒阈值过短,设备硬件响应、网络传输稍有延迟就会触发误超时,调整到10~15秒即可
- 适配华为MA5608T的实际提示符格式,不要硬编码写死美元符号的匹配规则:设备登录成功后的默认提示符为
<主机名>格式(例如<HUAWEI>),可使用通用规则/<\S+>/适配不同主机名场景,避免因主机名变更导致匹配失败 - 第一次跑通流程时保留完整Dump日志输出,对照实际返回的字节校准匹配规则,避免靠猜测编写正则
修复后的参考代码
use Net::Telnet (); $remote = new Net::Telnet (Timeout => 15, Errmode => 'return', Dump_Log => 'log.txt'); $remote->open("xxx.xxx.xxx.xxx") or die $remote->errmsg; # 去掉多余空格和行尾锚点匹配 $remote->waitfor('/>>User name:/i') or die $remote->errmsg; $remote->print("root") or die $remote->errmsg; $remote->waitfor('/>>User password:/i') or die $remote->errmsg; $remote->print("你的实际设备密码") or die $remote->errmsg; # 适配MA5608T默认的<主机名>提示符 $remote->waitfor('/<\S+>/') or die $remote->errmsg; $remote->print("display idle-timeout") or die $remote->errmsg; ($output) = $remote->waitfor('/<\S+>/') or die $remote->errmsg; print $output;
内容的提问来源于stack exchange,提问作者Andrzej Ogrodowski
相关产品推荐
相关产品推荐

