从SSH无法从字节解码为ASCII吗?

问题描述 投票:-1回答:1

下午好。我从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')不起作用。

python-3.x ascii paramiko ssh-tunnel
1个回答
0
投票

这里有一个答案:How can I remove the ANSI escape sequences from a string in python

还有其他方法...https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output

本质上,您是“屏幕抓取”输入,您需要剥离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)
© www.soinside.com 2019 - 2024. All rights reserved.