https://segmentfault.com/a/1190000040566946?utm_source=sf-similar-article

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

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

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

https://www.jianshu.com/p/ac0...


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_...
如果确定命令正常,可能是源码的问题了。
跑到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时注意调用你改写的类的方法,不然重写就没意义了,这样就可以保证输入命令时,编码统一。

[转帖]关于winrm远程ps登录执行出现中文乱码和?乱码问题及其解决办法的更多相关文章

  1. 远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法

    远程连接MySQL错误"plugin caching_sha2_password could not be loaded"的解决办法 问题描述: 今天在阿里云租了一个服务器,当我用 ...

  2. oracle执行update语句时卡住问题分析及解决办法

    转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...

  3. MySQL 执行SQL脚本 报ERROR 1231 (42000)的解决办法【转】

    今天在source mysqldump 备份文件时,发现导入的过程中报如下的错误: ERROR 1231 (42000): Variable 'time_zone' can't be set to t ...

  4. 远程桌面不能连接,提示awgina.dll取代错误的解决办法

    远程桌面不能连接,错误提示:您不能初始化一个远程桌面连接,因为在远程计算机上的windows登录软件被不兼容的软件c:\windows\system32\awgina.dll取代,如下图所示: 原因: ...

  5. Cobbler 登录web界面提示报错“Internal Server Error”解决办法

    Cobbler登录web页面报错 查看httpd日志/etc/httpd/logs/ssl_error_log 查看cobbler的py配置文件 sed -n '38,41p' /usr/share/ ...

  6. oracle中执行execute的时候报异常ORA-01031的解决办法

    在做实验的时候,编写关于"在存储过程中使用动态sql,建立一个统计表,并把统计结果,插入这个表中"的PL/sql语句在执行时出现权限不足的问题. 上网查询很多,看到了下面这篇博文( ...

  7. Windows10 远程桌面连接失败,报CredSSP加密oracle修正错误解决办法

    最近Windows10 升级后,发现不能远程连接. 不能访问的都报下面这个错了: 原因:按照提示的微软地址,看了下大致就是服务器端没有更新,而我的win10已经更新了一个安全补丁,如果双方都没有打补丁 ...

  8. 记一次腾讯云服务器centos linux可视化桌面安装并进行远程桌面登录及其安装中文包

    开始前请确保你有能上网的主机两部(一个是CentOS7系统,一个是Windows10系统)1.用SSH root用户登录Centos主机:2.检查你的centos是否装了epel库 执行命令:rpm ...

  9. Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表

    问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...

  10. 服务器--远程桌面选择"本地资源"下不显示"本地磁盘"的解决办法(转)

    转自:http://blog.sina.com.cn/s/blog_4cd978f90102wsvc.html “远程连接桌面”,每次连接候,我都选择了“本地资源”下面的“磁盘驱动器”,都会在远程电脑 ...

随机推荐

  1. EDS从小白到专家丨打造你的专属“数据物流”系统

    "数据快递"如何支撑便捷就医?本期让我们来了解如何使用EDS打造专属的"数据物流"系统...... 本文分享自华为云社区<[EDS从小白到专家]第2期-E ...

  2. AI推理实践丨多路极致性能目标检测最佳实践设计解密

    摘要:基于CANN的多路极致性能目标检测最佳实践设计解密. 本文分享自华为云社区<基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密>,作者: 昇腾CANN . 当前人工智能 ...

  3. 基于k6和python进行自动化性能测试

    摘要:在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6. 本文分享自华为云社区<基于k6和python进行自动化性能测试>,作者: 风做 ...

  4. 手把手教你在昇腾平台上搭建PyTorch训练环境

    摘要:在昇腾平台上运行PyTorch业务时,需要搭建异构计算架构CANN软件开发环境,并安装PyTorch 框架,从而实现训练脚本的迁移.开发和调试. 本文分享自华为云社区<手把手教你在昇腾平台 ...

  5. 用了这个评估优化LiteOS镜像利器,我有点飘...

    摘要:本文会给大家介绍下LiteOS Studio的镜像分析工具,这可是一个评估.优化镜像文件RAM.ROM占用大小的利器. 大家都知道嵌入式开发板由于受成本限制,芯片的RAM.Flash等硬件资源有 ...

  6. FusionInsight MRS Flink DataStream API读写Hudi实践

    摘要:目前Hudi只支持FlinkSQL进行数据读写,但是在实际项目开发中一些客户存在使用Flink DataStream API读写Hudi的诉求. 本文分享自华为云社区<FusionInsi ...

  7. OCR性能优化:从认识BiLSTM网络结构开始

    摘要: 想要对OCR进行性能优化,首先要了解清楚待优化的OCR网络的结构,本文从动机的角度来推演下基于Seq2Seq结构的OCR网络是如何一步步搭建起来的. 本文分享自华为云社区<OCR性能优化 ...

  8. 详解4种微服务框架接入Istio方案

    摘要:使用k8s和lstio网格进行开发,将服务发现.服务治理留给基础设施,可以将开发人员从复杂的服务中解脱出来,专注于业务开发,是当前来说比较好的解决方案. 本文分享自华为云社区<传统微服务框 ...

  9. 【JAVA基础】List处理

    List处理 List使用Lists.partition()分片 public static <T> List<List<T>> partition(List< ...

  10. 核心工具之 ideavim

    对于个人的核心工具集的选择,因为编程中熟练使用主力IDE能够大大提高效率,所以IDE是一个必选项.而IDE与VIM结合的插件,对于VIM使用者,常常是一个必选项. 在Jetbrains系列工具中,插件 ...