使用带有西里尔输出的 paramiko exec_command 时如何获得正确的编码输出

我正在使用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)行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'

我错过了什么?我希望输出像控制台一样是西里尔文。


弑天下
浏览 205回答 1
1回答

繁花不似锦

好吧,这个问题与paramiko. 在声明 a 时,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')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python