Paramiko stdout 卡在路由器横幅消息处

Paramiko stdout stuck at router banner message

我对 Paramiko 还很陌生,如果这个问题已经得到解答,我深表歉意

我正在尝试自动登录和执行 PAN 防火墙。 FW输出如下:

Last login: Wed Apr 27 11:54:01 2022 from 10.54.90.24



Number of failed attempts since last successful login: 0



admin@PA-5440-F03_31> show transceiver-detail all

我的代码如下:

>>> import paramiko
>>> command = "show transceiver-detail all"
>>> client = paramiko.client.SSHClient()
>>> client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> client.connect(hostname, username=username, password=password)
>>> _stdin, _stdout, _stderr = client.exec_command(command)
>>> client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> client.connect(hostname, username=username, password=password)
>>> _stdin, _stdout, _stderr = client.exec_command(command)

我的问题是,当我读取 _stdout 时:

>>> print(stdout.read().decode())

我只得到横幅:

'\n\n\nNumber of failed attempts since last successful login: 0\n\n\n\n'

如何到达 exec_command returns stdout 捕获输出的地步?

注意:在读取命令起作用之前,我必须明确关闭 _stdout 通道(_stdout.channel.close())。不确定这是标准程序还是我需要做些什么来确保频道自动关闭。

原来 PAN 有自己的 Python 模块 - pandevice - 可以处理这个问题。

from pandevice.firewall import Firewall
import xml.etree.ElementTree as ET

fw = Firewall(hostname, api_username=<username>, api_password=<password>)
result = fw.op(cmd='show transceiver-detail all')

>>> type(result)
<class 'xml.etree.ElementTree.Element'>