执行相当标准的paramiko实现会在远程命令的奇怪形式文本的readlines()上返回解码错误。我无法更改命令输出。如何编写代码以正确解码。请参阅底部的解码错误文本:
正在使用的代码片段:
connect = paramiko.SSHClient()
connect.connect(self.name,
username = self.ruser,
password = password,
key_filename = idkey,
timeout = 15,
)
stdin, stdout, stderr = connect.exec_command(cmd)
retval=stdout.channel.recv_exit_status()
stdin.flush()
stdout.flush()
stderr.flush()
out = stdout.readlines()
sys.exit()
错误文字:
文件" ../ pylib / hosts / host.py",第128行,在cmd中
out = stdout.readlines()
文件" /usr/local/lib/python3.4/site-packages/paramiko/file.py",第285行,在readlines中
line = self.readline()
文件" /usr/local/lib/python3.4/site-packages/paramiko/file.py",第270行,在readline中
返回行如果self._flags& self.FLAG_BINARY否则你(行)
文件" /usr/local/lib/python3.4/site-packages/paramiko/py3compat.py" ;,第148行,在你身上
return s.decode(encoding)
UnicodeDecodeError:' utf-8'编解码器不能解码位置80中的字节0xe2:无效的连续字节
答案 0 :(得分:2)
好吧,我修改了python 3的paramiko.py3compat“u”方法。(没有修改python 2版本)如果utf8解码失败,请尝试ISO-8859-1。标准尝试:除了:包装器。
怀疑这个问题只发生在Python 3上。本来很高兴覆盖py3compay.pt u()方法而不是修改paramiko库文件,但需要继续解决这个问题。
这是我修补到py3compat.py中的新u()方法:
def u(s, encoding='utf8'):
"""cast bytes or unicode to unicode"""
if isinstance(s, bytes):
try:
return s.decode(encoding)
except UnicodeDecodeError:
return s.decode('ISO-8859-1')
elif isinstance(s, str):
return s
else:
raise TypeError("Expected unicode or bytes, got %r" % s)