首页 文章

paramiko-1.16.0 readlines()解码错误

提问于
浏览
1

做一个相当标准的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()
在readlines中文件"/usr/local/lib/python3.4/site-packages/paramiko/file.py",第285行
line = self.readline()
文件"/usr/local/lib/python3.4/site-packages/paramiko/file.py",第270行,在readline中
返回行如果self._flags&self.FLAG_BINARY否则u(行)
档案"/usr/local/lib/python3.4/site-packages/paramiko/py3compat.py",第148行,
在你返回s.decode(编码)
UnicodeDecodeError:'utf-8' codec无法解码位置80中的字节0xe2:无效的连续字节

1 回答

  • 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)
    

相关问题