如何让 Junos PyEZ 通过控制台端口工作?

How to make Junos PyEZ work via console port?

我正在尝试通过控制台端口使 Junos PyEZ 工作(telnet 到连接到 Juniper SRX-240 控制台端口的 Cisco AS2511-RJ 终端服务器)。

测试脚本是

dev = Device(host='X.X.X.X', user='XXX', password='XXXXXXXX',
    mode='telnet', port='2014', gather_facts=True)
try:
    dev.open()
    print(dev.facts)
    print(dev.cli("show version", format='text', warning=False))
except RuntimeError as rte:
    print("Exception: " + str(rte) )
finally:
    dev.close()

我的问题是脚本有时会运行,但大多数运行都不成功。尝试失败后,我在日志中看到类似

的内容
Nov  8 21:17:29  srxD-2 login: Login attempt for user <close-session/> from host [unknown]
Nov  8 21:17:29  srxD-2 login[39846]: LOGIN_PAM_AUTHENTICATION_ERROR: Failed password for user <close-session/>
Nov  8 21:17:29  srxD-2 login[39846]: LOGIN_FAILED: Login failed for user <close-session/> from host ttyu0
...........
    Nov  8 21:22:41  srxD-2 login: Login attempt for user d-trailer from host [unknown]
...........

所以 PyEZ 似乎并不总是能很好地处理我的控制台的屏幕抓取。任何想法为什么会这样以及如何解决它?我正在使用 github 中 PyEZ 的当前主分支进行测试。

您能否更改脚本以使用 python 上下文管理器,如下所示(它将负责关闭连接)?使用控制台连接(屏幕抓取),如果连接未正确关闭,下次脚本可能会出现问题。

with Device(host='X.X.X.X', user='XXX', password='XXXXXXXX',
    mode='telnet', port='2014', gather_facts=True) as dev:
    print(dev.facts)
    print(dev.cli("show version", format='text', warning=False))

您能否分享日志来源的详细信息,因为这些不是来自 PyEZ?

已通过添加 console_has_banner=True 选项解决此问题,如下所示:

with Device(host='X.X.X.X', user='XXX', password='XXXXXX', mode='telnet', 
        port='2014', gather_facts=True, console_has_banner=True) as dev:
    print(dev.facts)
    print(dev.cli("show version", format='text', warning=False))

应用此选项后,脚本现在每次都能正常运行。

查看更多详细信息in this pull request