下午好。我从SSH获得以下示例:
b"rxmop:moty=rxotg;\x1b[61C\r\nRADIO X-CEIVER ADMINISTRATION\x1b[50C\r\nMANAGED OBJECT DATA\x1b[60C\r\n\x1b[79C\r\nMO\x1b[9;19HRSITE\x1b[9;55HCOMB FHOP MODEL\x1b[8C\r\nRXOTG-58\x1b[10;19H54045_1800\x1b[10;55HHYB"
我处理ssh.recv(99999).decode('ASCII')但是某些字符未解码,例如:
\x1b[61C
\x1b[50C
\x1b[9;55H
\x1b[9;19H
下面的文章解释说,这些是自从我使用invoke_shell以来出现的ANSI转义代码。以前,一切正常,直到移动到另一台服务器为止。Is there a simple way to get rid of junk values that come when you SSH using Python's Paramiko library and fetch output from CLI of a remote machine?
当我写文件时,我也会得到:
rxmop:moty=rxotg;[61C
RADIO X-CEIVER ADMINISTRATION[50C
MANAGED OBJECT DATA[60C
[79C
MO[9;19HRSITE[9;55HCOMB FHOP MODEL[8C
RXOTG-58[10;19H54045_1800[10;55HHYB
如果使用PuTTY,一切都将变得清晰美丽。我无法摆脱invoke_shell,因为连接是从一台服务器抛出到另一台服务器的。下面的示例代码:
# coding:ascii
import paramiko
port = 22
data = ""
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=secret, port=port, timeout=10)
ssh = client.invoke_shell()
ssh.send("rxmop:moty=rxotg;\n")
while data.find("<") == -1:
time.sleep(0.1)
data += ssh.recv(99999).decode('ascii')
ssh.close()
client.close()
f = open('text.txt', 'w')
f.write(data)
f.close()
正常输出如下:
MO RSITE COMB FHOP MODEL
RXOTG-58 54045_1800 HYB BB G12
SWVERREPL SWVERDLD SWVERACT TMODE
B1314R081D TDM
CONFMD CONFACT TRACO ABISALLOC CLUSTERID SCGR
NODEL 4 POOL FLEXIBLE
DAMRCR CLTGINST CCCHCMD SWVERCHG
NORMAL UNLOCKED
PTA JBSDL PAL JBPTA
TGFID SIGDEL BSSWANTED PACKALG
H'0001-19B3 NORMAL
您可以建议什么以返回正常输出,以便处理所有字符?正则表达式无济于事,因为记录的结构发生了变化,所以从代码中的某些位置选择了字符。PS尝试使用ssh.invoke_shell(term ='xterm')不起作用。
这里有一个答案:How can I remove the ANSI escape sequences from a string in python
本质上,您是“屏幕抓取”输入,您需要剥离ANSI代码。因此,获取输入,然后剥离代码。
import re
... (your ssh connection here)
data = ""
while data.find("<") == -1:
time.sleep(0.1)
chunk = ssh.recv(99999)
data += chunk
... (your ssh connection cleanup here)
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
data = ansi_escape.sub('', data)