1. 首先使用chardet查看返回的数据编码
import chardet
print(chardet.detect(return_data))
查看打印,可以发现该串字符编码是“Windows-1254”,语言是“Turkish”(离谱)
2. 修改winrm源码
查看winrm源码(一般在python->Lib->site-packages下,文件夹名为winrm),在其中protocol.py
文件中可以看到以下两段代码
第一段代码
def open_shell(self, i_stream='stdin', o_stream='stdout stderr',
working_directory=None, env_vars=None, noprofile=False,
codepage=437, lifetime=None, idle_timeout=None):
将其中的codepage=437
改成codepage=936
第二段代码
if isinstance(stdin_input, text_type):
stdin_input = stdin_input.encode("437")
同理,将其中的437改为936即可
3. 解析返回的数据
winrm = winrm.Session(ip + ':5985', auth=(username, password))
return_data = winrm.run_cmd(command)
return_data = return_data.std_out.decode('gbk') # 当IBM发明代码页时,把GBK放在了第936页,所以它被称为CP936,因此在这里要用gbk去解析