Pexpect在Cisco路由器SSH登录的RSA Yes/No提示符处失效
解决Pexpect卡在RSA密钥确认的问题
我之前也碰到过一模一样的情况,大概率是你的正则表达式写法出了问题,导致Pexpect没正确匹配到RSA的确认提示符。咱们一步步来修复:
1. 修正正则表达式的双重转义问题
你原来写的'\(yes\/no\)\?'犯了双重转义的错误:Python字符串会先解析一次\,传到Pexpect的正则就变味了。换成Python的原始字符串会更可靠,不用额外转义括号和斜杠,直接让Pexpect拿到正确的匹配规则:
rsa_key = r'(yes/no)\?'
2. 优化expect的匹配逻辑
你原来的第三个匹配项""完全没必要,反而会导致误匹配空字符串;另外可以给expect加个超时参数,避免因为网络延迟提前退出匹配:
# 增加超时时间,适配网络较慢的场景 i = child.expect([rsa_key, prompt], timeout=30)
3. 完整的修正后代码片段
顺便提一句,Python 3里file()已经被废弃,换成open()更规范,同时增加异常处理让代码更健壮:
fout = open(filepath, 'w') child = pexpect.spawn(f'ssh {username}@{agg}') child.logfile_read = fout rsa_key = r'(yes/no)\?' prompt = "Password:" try: i = child.expect([rsa_key, prompt], timeout=30) if i == 0: child.sendline('yes') # 再次等待密码提示符出现 child.expect(prompt, timeout=10) child.sendline(password) elif i == 1: child.sendline(password) # 这里继续写你要执行的后续命令 # child.sendline('show running-config') # ... except pexpect.TIMEOUT: print("超时啦,检查下网络连接或者设备响应速度") except pexpect.EOF: print("连接意外断开了") finally: fout.close()
额外排查小技巧
如果还是不行,打开你生成的log文件看看实际输出:
- 确认RSA提示符是不是完整的
Are you sure you want to continue connecting (yes/no)?,如果是,就把正则改成r'Are you sure you want to continue connecting \(yes/no\)\?' - 或者用更宽松的匹配,比如直接写
r'yes/no\?',只抓关键部分
内容的提问来源于stack exchange,提问作者dkeeper09
相关产品推荐
相关产品推荐

