Как получить правильно закодированный вывод при использовании paramiko exec_command с выводом кириллицы - PullRequest
0 голосов
/ 16 апреля 2019

Я использую paramiko и python-3.7 для подключения к удаленной машине RedHat и запуска на нем скрипта.

Мой python код (он внутри метода класса с представленной self.logger)выглядит так:

import 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: ▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒ ▒▒▒ ▒▒▒▒▒▒▒▒

whileесли я войду на сервер и попытаюсь выполнить команду, она вернет кириллический текст:

-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 голосов
/ 17 апреля 2019

Ну, проблема не была связана с 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')
...