Expect4j中expect()方法返回值及CISCO IOS登录返回值异常咨询
关于Expect4j的两个问题解答
1. Expect4j里expect(String)方法的返回值到底是什么?
咱们先把这个说清楚:当你调用expect("某个字符串")的时候,返回值其实是匹配到的模式在你传入的模式集合里的索引——因为你只传了单个字符串,所以匹配成功的话会返回0(毕竟这是第一个也是唯一一个模式)。要是匹配失败,就会返回负数,不同的负数对应不同的错误情况,比如你之前遇到的-2(一般是超时或者没找到匹配项),还有现在碰到的-3。
2. 明明匹配正确却返回-3?这几个原因你得排查下
首先得明确,-3在Expect4j里大多对应**EOF(文件结束)**状态,简单说就是Expect4j觉得输入流已经断了,没数据可读了,哪怕你看着提示符已经出来了。结合你登录CISCO IOS路由器的场景,大概率是这几个情况:
- 底层连接悄悄断了:你发完密码后,路由器可能确实返回了提示符,但网络波动、路由器的会话超时设置,或者设备端的某些异常,导致连接的Socket被关闭了。这时候Expect4j读到了EOF标记,就会返回-3,哪怕你肉眼看到了提示符。
- 匹配的字符串没真正命中:你用的
"XYZ#"看起来没问题,但路由器返回的提示符里可能藏着你看不到的字符——比如多余的换行、空格,甚至终端的颜色控制代码。这时候你的字符串匹配其实没成功,刚好流又断了,就返回了-3。建议你把匹配模式改成更灵活的正则,比如"XYZ#\\s*$"(考虑后面的空白字符),或者先把当前缓冲区的内容打出来看看,比如加一行代码:
这样就能知道路由器到底返回了啥,是不是和你预期的一样。System.out.println("实际收到的内容:" + expect.getCurrentBuffer()); - 换行符不对导致设备异常:你用的
NEW_LINE是\n还是\r\n?有些CISCO设备只认\r作为换行,要是你传的换行符不对,路由器可能没正确处理密码,后续直接断了连接,自然就触发EOF了。 - 超时设置的锅?:虽然一般超时返回-2,但如果超时设置太短,加上网络延迟,可能流还没完全输出就触发了超时,有时候也会被当成EOF处理,返回-3。你可以试试把超时时间调长一点看看。
内容的提问来源于stack exchange,提问作者user3824001
相关产品推荐
相关产品推荐

