关于winrm远程ps登录执行出现中文乱码问题及其解决办法

pyhton的winrm库提供了命令行远程连接的功能,可以实现远程登录并进行执行指令的功能:
1.远端登录

import winrm
auth = (username, password)
shell = winrm.Session(host_ip, auth=auth, transport='ntlm')
          

当然,如果想实现远端连接,客户端和服务端都要进行winrm服务的开启和设置,详细请参考:

//www.greatytc.com/p/ac095497bad4


2.执行命令
winrm作为面向window远程连接的库,提供了两种执行命令的执行方式,cmd命令和ps命令,两种命令还是有区别的,例如ps的命令直接用cmd跑就会报错,二者的区别笔者借鉴了网上的说法:

powershell 可以看作 cmd 的超集,所有的常用命令诸如dir, cd, ipconfig等在 powershell 中都能直接使用。但背后的实现方式是完全不同的,powershell 基于完全的面向对象,它通过给函数和对象“起别名”的方式来支持这些旧的命令

具体二者的区别感兴趣的可以去深究,看各位需求。
执行命令很简单,直接用已生成的shell对象去调用对应的方法就好

res = shell.run_ps('ipconfig')
res = shell.run_cmd('ipconfig')

想要获取命令返回的内容,可以直接
res.std_out.decode()
res还有其他参数,如状态码等,需要的可以直接使用


3.返回结果出现中文乱码问题
方法一:
首先需明确是不是出现在回显回来时编码出现问题

import chardet
print(chartdet.detect(res.std_out))

查看编码类型

直接decode print出来的编码类型,例如print出来的是gb2312 ,那么就使用
res.std_out.decode('gb2112')

方法二:
如果不是输出的时候有问题,那就要考虑发送命令的时候是不是有问题
首先,应该确保出问题的命令是否能跑,可以通过远程连接到对应的服务器,手动跑一下,powershell 远程登录可以参考:https://blog.csdn.net/weixin_40943540/article/details/89344265
如果确定命令正常,可能是源码的问题了。
跑到wirm的源码里看看情况,我这里的版本是pywinrm 0.4.2

  def run_cmd(self, command, args=()):
        # TODO optimize perf. Do not call open/close shell every time
        shell_id = self.protocol.open_shell()
        command_id = self.protocol.run_command(shell_id, command, args)
        rs = Response(self.protocol.get_command_output(shell_id, command_id))
        self.protocol.cleanup_command(shell_id, command_id)
        self.protocol.close_shell(shell_id)
        return rs

    def run_ps(self, script):
        """base64 encodes a Powershell script and executes the powershell
        encoded script command
        """
        # must use utf16 little endian on windows
        encoded_ps = b64encode(script.encode('utf_16_le')).decode('ascii')
        rs = self.run_cmd('powershell -encodedcommand {0}'.format(encoded_ps))
        if len(rs.std_err):
            # if there was an error message, clean it it up and make it human
            # readable
            rs.std_err = self._clean_error_msg(rs.std_err)
        return rs

重点观察这两个函数,我们可以看到,当你执行 run_ps时,他会通过转码后直接调用run_cmd,所以这是不是可以认为ps命令通过转码后就可以跑到cmd执行呢?这个只是一个猜测,有待研究。出现中文问题乱码的问题可能也是出现在这个转码上!
通过debug可以看到,我们输入的命令的condepage为936,而库默认的编码为437,这就会使输入的命令出现乱码现象,现在要做的就是统一编码。
第一步:继承winrm.Session这个类,并进行重写run_cmd

    def run_cmd(self, command, args=()):
        # TODO optimize perf. Do not call open/close shell every time
        shell_id = self.protocol.open_shell(codepage=936)
        command_id = self.protocol.run_command(shell_id, command, args)
        rs = winrm.Response(self.protocol.get_command_output(shell_id, command_id))
        self.protocol.cleanup_command(shell_id, command_id)
        self.protocol.close_shell(shell_id)
        return rs

第二步:在执行命令前设置好shell的编码

shell.protocol.open_shell(codepage='936')

重写调用run_ps和run_cnd时注意调用你改写的类的方法,不然重写就没意义了,这样就可以保证输入命令时,编码统一。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容