You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:22:26