我正在使用paramiko
和python-3.7
连接到远程RedHat机器并在其上执行脚本。
我的python
代码(它位于一个呈现self.logger
的类方法中(如下所示:
进口帕拉米科
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.encode('utf-8'))
替换self.logger.error(line)
行,但输出如下所示:
2019-04-16 18:22:02,208:ERROR: b'bash: /tmp/some_script.sh: xd0x9dxd0xb5xd1x82 xd1x82xd0xb0xd0xbaxd0xbexd0xb3xd0xbe xd1x84xd0xb0xd0xb9xd0xbbxd0xb0 xd0xb8xd0xbbxd0xb8 xd0xbaxd0xb0xd1x82xd0xb0xd0xbbxd0xbexd0xb3xd0xb0n'
我错过了什么?我希望输出像控制台一样是西里尔文。
好吧,问题与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')