我使用paramiko连接到机器并提取其syslog。 当我尝试使用函数readlines()时,我收到了UnicodeDecodeError。
这是该计划:
print_all_lines="awk 'FNR>=%s && FNR <=%s' /var/log/syslog" %(line_number_start, line_number_end)
stdin, stdout, stderr = SSH.exec_command(print_all_lines)
stdout.readlines()
这是错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc5 in position 199: invalid continuation byte
答案 0 :(得分:0)
readline()
和readlines()
会尝试将数据解码为UTF-8
,因此如果数据实际上不在UTF-8
中,则可能会失败。您可以使用不会进行解码的read()
:
stdin, stdout, stderr = SSH.exec_command(print_all_lines)
s = stdout.read()
参见以下示例(在交互式python中):
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n')
>>> v = stdout.readlines()
Traceback (most recent call last):
[...snip...]
File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc5 in position 0:
invalid continuation byte
>>>
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n')
>>> v = stdout.read()
>>> v
'\xc5\n'
>>>
刚看了一下源代码,它有一个未记录的函数_set_mode()
,可用于将 stdout 设置为二进制模式,禁用解码:
>>> stdin, stdout, stderr = ssh.exec_command(r'printf \\xc5\\n\\xc5\\n')
>>> stdout._set_mode('b')
>>> v = stdout.readlines()
>>> v
['\xc5\n', '\xc5\n']
>>>