将paramiko exec_command与西里尔文输出配合使用时,如何获得正确的编码输出

时间:2019-04-16 15:25:21

标签: python python-3.x paramiko

我正在使用paramikopython-3.7连接到远程RedHat计算机并在其上执行脚本。

我的python代码(位于提供了self.logger的类方法中)如下:

导入paramiko

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(server_name, port=22, username=login, password=password, timeout=3) 
(_, stdout, stderr) = client.exec_command('/tmp/some_script.sh')
for line in stderr:
    self.logger.error(line)

如果执行的脚本/tmp/some_script.py不存在,那么在我的日志中,我会收到下一行:

2019-04-16 18:03:05,528:ERROR: bash: /tmp/some_script.sh: ▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒

如果我登录到服务器并尝试命令,它将返回西里尔文字:

-bash: /tmp/some_script.sh: Нет такого файла или каталога

该消息表示“没有这样的文件或目录”

我试图用self.logger.error(line)替换self.logger.error(line.encode('utf-8'))行,但是输出看起来像这样:

2019-04-16 18:22:02,208:ERROR: b'bash: /tmp/some_script.sh: \xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb0\xd0\xba\xd0\xbe\xd0\xb3\xd0\xbe \xd1\x84\xd0\xb0\xd0\xb9\xd0\xbb\xd0\xb0 \xd0\xb8\xd0\xbb\xd0\xb8 \xd0\xba\xd0\xb0\xd1\x82\xd0\xb0\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb0\n'

我想念什么?我希望输出像控制台一样西里尔字母。

1 个答案:

答案 0 :(得分:0)

好吧,问题与paramiko无关。 在声明RotatingFileHandler时,我没有指定encoding参数。 我有:

fh = logging.handlers.RotatingFileHandler(
    'log/logname.log', 
    'a', 
    10000000, 
    3)

正确的行是:

fh = logging.handlers.RotatingFileHandler(
    'log/logname.log', 
    'a', 
    10000000, 
    3,
    encoding='utf-8')