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. C++通过文件指针获取文件大小

    目录 1. 叙述 2. 结论 1. 叙述 对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取.网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小.但是我总觉得这样做可 ...

  2. Llama2-Chinese项目:7-外延能力LangChain集成

      本文介绍了Llama2模型集成LangChain框架的具体实现,这样可更方便地基于Llama2开发文档检索.问答机器人和智能体应用等. 1.调用Llama2类   针对LangChain[1]框架 ...

  3. 深入浅出Sqoop之迁移过程源码分析

    [摘要]Sqoop是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具 .本文将简单介绍Sqoop作业执行时相关的类及方法,并将该过程与MapReduce的 ...

  4. GaussDB for DWS:内存自适应控制技术总结

    1.技术背景 在SQL语句复杂.处理数据量大的AP场景下,单个查询对内存的需求越来越大,多个语句的并发很容易将系统的内存吃满,造成内存不足的问题.为了应对这种问题,GaussDB for DWS引入了 ...

  5. 聆听无声的话语:手把手教你用ModelArts实现手语识别

    摘要:ModelArts,化作我们与听力障碍之间的一座沟通桥梁. 据统计,我国有超过2000万人有听力语言障碍,每年有约3万名婴儿生来就失去了聆听的机会.或许是因为缺少与没有听力障碍的人交流的途径,环 ...

  6. DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术

    摘要:详解华为云低时延直播在时延.首屏.卡顿率等体验的优化方案,及如何快速接入方法. 本文分享自华为云社区<DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术>, ...

  7. vue2升级vue3: Event Bus 替代方案

    在看 https://v3-migration.vuejs.org/breaking-changes/events-api.html 在vue2里面 In 2.x, a Vue instance co ...

  8. 引用 AspNetCoreRateLimit => StatusCode cannot be set because the response has already started.

    app.UseIpRateLimiting(); #需要放在前面,否则抓去不准,还有可能会出现下列错误 本次出现这个错误,是因为  .Net Core 跨域 里面的这行:httpContext.Res ...

  9. SrpingBoot 集成 xxl-job 部署在 Docker 上碰到的坑

    如果不指定 xxl.job.executor.ip,默认会用 Docker 的IP,注册到 xxl-job 里面,这时候无法回调 如果xxl.job.executor.ip.xxl.job.execu ...

  10. 语音顶会 ICASSP 2022 成果分享:基于时频感知域模型的单通道语音增强算法

    近日,阿里云视频云音频技术团队与新加坡国立大学李海洲教授团队合作论文 <基于时频感知域模型的单通道语音增强算法 >(Time-Frequency Attention for Monaura ...