[转帖]关于winrm远程ps登录执行出现中文乱码和?乱码问题及其解决办法
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服务的开启和设置,详细请参考:
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登录执行出现中文乱码和?乱码问题及其解决办法的更多相关文章
- 远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法
远程连接MySQL错误"plugin caching_sha2_password could not be loaded"的解决办法 问题描述: 今天在阿里云租了一个服务器,当我用 ...
- oracle执行update语句时卡住问题分析及解决办法
转载:http://www.jb51.net/article/125754.htm 这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值, ...
- MySQL 执行SQL脚本 报ERROR 1231 (42000)的解决办法【转】
今天在source mysqldump 备份文件时,发现导入的过程中报如下的错误: ERROR 1231 (42000): Variable 'time_zone' can't be set to t ...
- 远程桌面不能连接,提示awgina.dll取代错误的解决办法
远程桌面不能连接,错误提示:您不能初始化一个远程桌面连接,因为在远程计算机上的windows登录软件被不兼容的软件c:\windows\system32\awgina.dll取代,如下图所示: 原因: ...
- Cobbler 登录web界面提示报错“Internal Server Error”解决办法
Cobbler登录web页面报错 查看httpd日志/etc/httpd/logs/ssl_error_log 查看cobbler的py配置文件 sed -n '38,41p' /usr/share/ ...
- oracle中执行execute的时候报异常ORA-01031的解决办法
在做实验的时候,编写关于"在存储过程中使用动态sql,建立一个统计表,并把统计结果,插入这个表中"的PL/sql语句在执行时出现权限不足的问题. 上网查询很多,看到了下面这篇博文( ...
- Windows10 远程桌面连接失败,报CredSSP加密oracle修正错误解决办法
最近Windows10 升级后,发现不能远程连接. 不能访问的都报下面这个错了: 原因:按照提示的微软地址,看了下大致就是服务器端没有更新,而我的win10已经更新了一个安全补丁,如果双方都没有打补丁 ...
- 记一次腾讯云服务器centos linux可视化桌面安装并进行远程桌面登录及其安装中文包
开始前请确保你有能上网的主机两部(一个是CentOS7系统,一个是Windows10系统)1.用SSH root用户登录Centos主机:2.检查你的centos是否装了epel库 执行命令:rpm ...
- Win10 远程桌面连接出现“要求的函数不受支持”的解决办法之修改注册表
问题起因 笔者自己在阿里云上搞服务器,有一台 Windows Server 必须通过远程桌面连接来管理,由于没能完全关掉 Win10 自带的烦人的系统更新,导致昨天安装完更新后出现了连接远程桌面时“要 ...
- 服务器--远程桌面选择"本地资源"下不显示"本地磁盘"的解决办法(转)
转自:http://blog.sina.com.cn/s/blog_4cd978f90102wsvc.html “远程连接桌面”,每次连接候,我都选择了“本地资源”下面的“磁盘驱动器”,都会在远程电脑 ...
随机推荐
- 关于GO语言,这篇文章讲的很明白
摘要:本文从Go的语法,类型系统,编码风格,语言工具,编码工具和使用案例等几方面对Go语言进行了学习和探讨. Go语言发布之后,很多公司特别是云厂商也开始用Go语言重构产品的基础架构,而且很多企业都是 ...
- 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了
摘要:充电团聚云上见,顺便攒攒压岁钱. 春!节!倒!计!时!啦! 农历新年即将到来,热闹的过年氛围逐渐弥漫,华为云社区先给大家拜个早年,祝所有小伙伴们新春快乐,牛年大吉! 回望2020年,社区涌现了许 ...
- 整理混乱的头文件,我用include what you use
摘要:使用include-what-you-use(iwyu/IWYU)清理冗余头文件,补充必要头文件. 本文分享自华为云社区<用include what you use拯救混乱的头文件> ...
- 关于单元测试的那些事儿,Mockito 都能帮你解决
摘要:相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口:如何测试一个包含客户端调用服务端的复杂方法:如何测试一个包含从数据库读取数据的复杂方法...这些 ...
- 华为云GaussDB(for MySQL)2.0全新升级,三大技术大揭秘
摘要:9月23日,在华为全联接2021主会场,华为高级副总裁.华为云CEO.消费者云服务总裁张平安发表"深耕数字化,一切皆服务"主题演讲,并发布了GaussDB(for MySQL ...
- 火山引擎 DataTester:A/B 实验如何实现人群智能化定向?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在精细化运营时代,用户需求和业务场景愈加多元,在产品功能迭代以及各类活动中,面向不同人群的兴趣点,有针对性地&qu ...
- 将MyBatis Mapper xml 放到 jar 包外面
在不改程序的情况下,修改 sql 时,需要将 Mapper 中的 XML 文件 放到外面 mybatis: mapper-locations: classpath:mapper/*.xml #J ...
- 🤗Hugging Face 87个 AI 游戏可以在线玩啦
7月9日结束的开源游戏挑战赛有超过来自全球 1000 多名开发者参加 一共收录了 87 个游戏 目前已经进入投票期 视频中的:猜名画 ️ 用了之前推荐的 LEDITS 目前得分很高呢 来试试看你能猜对 ...
- 【软件安装记录篇】本地虚拟机Centos7快速安装MySQL
安装 采用Installing MySQL on Linux Using the MySQL Yum Repository的方式进行安装. 1. 首先下载服务器版本对应的rpm文件,下载地址:[链接] ...
- TypeError: this.libOptions.parse is not a function
安装完node.js运行项目后,报错: TypeError: this.libOptions.parse is not a function at ESLint8Plugin.<anonymou ...