python - 使用带有西里尔输出的 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'
我错过了什么?我希望输出像控制台一样是西里尔文。
解决方案
好吧,这个问题与paramiko
. 在声明 aRotatingFileHandler
时,我没有指定encoding
参数。我有:
fh = logging.handlers.RotatingFileHandler(
'log/logname.log',
'a',
10000000,
3)
正确的行是:
fh = logging.handlers.RotatingFileHandler(
'log/logname.log',
'a',
10000000,
3,
encoding='utf-8')
推荐阅读
- sql-server - T-SQL 从父表中删除记录时数据库发生冲突
- java - 如何使用描述符(protobuf,java)将字节数组解析为 GeneratedMessage?
- python - numpy 数组的缓存装饰器
- java - 在休眠中处理大型数据库交互
- excel - 如何在 xml 元素中添加字符 - VBA
- sapui5 - 单击 sap.m.Tree 列表项时的面包屑并在单击面包屑时展开折叠树
- android - 为 TextViews 应用程序范围设置文本对齐属性
- android - 在更改屏幕方向时更改相机预览模式
- angular - ngx-bootstrap 的 datePicker (onShown) 事件在真正显示日历之前触发
- python - 将 txt 文件读取为包含 numpy 数组的 dict