python+winrm实现远程连接Windows服务器,并执⾏指定命
令
查到windows服务器连接的⼀个强⼤的第三⽅库winrm,类似于paramiko模块(实现远程连接Linux虚拟机(服务器)并执⾏指定命令返回输出结果),只不过winrm是可以在Windows环境下执⾏命令。Windows远程管理(WinRM)是Windows Server 2003
R2,Windows Vista和Windows Server 2008中⼀种新式的⽅便远程管理的服务。
windows上开启winrm服务
winrm service 默认都是未启⽤的状态,先查看状态,如⽆返回信息,则是没有启动。
打开powershell终端,输⼊下列命令进⾏配置:
winrm enumerate winrm/config/listener
针对winrm service 进⾏基础配置:
winrm quickconfig
如果出现“拒绝访问”错误
解决⽅法:以管理员⾝份执⾏。
查看winrm service listener:
winrm e winrm/config/listener
为winrm service 配置auth:
winrm set winrm/config/service/auth @{Basic="true"}
为winrm service 配置加密⽅式为允许⾮加密:
winrm set winrm/config/service @{AllowUnencrypted="true"}
注意:如果以上两个命令执⾏会报错
错误: Invalid use of command line. Type "winrm -?" for help.
需要在@{Basic="true"}外部加单引号'才可以!
启动/关闭winrm服务命令:net start/stop winrm
⾄此,winrm service 已经启⽤,可以正常使⽤
安装python库:winrm
安装⽅法如下:
pip install pywinrm
这⾥进⾏了简单的实践,远程连接Windows服务器后查询服务器的IP信息:
代码如下:
import winrm
def winCMD(hostip='hostip', username='username', password='password'):
"""
在 windows 下执⾏命令
:
param hostip: 远程Windows服务器IP
:param username: 远程Windows服务器⽤户名
python虚拟机:param password: 远程Windows服务器密码
:return:
"""
wintest = winrm.Session('' + hostip + ':5985/wsman', auth=(username, password))
# ret = wintest.run_cmd("cmd命令") 多个命令使⽤ & 符号连接
ret = wintest.run_cmd("ipconfig")
print(ret)
# 正常输出信息
print(ret.std_out.decode())
# 错误信息
print(ret.std_err.decode())
注:输出中⽂乱码问题解决⽅法,run_cmd()⽅法,修改self.protocol.open_shell(codepage=936)参数
def run_cmd(self, command, args=()):
# TODO optimize perf. Do not call open/close shell every time
# 中⽂编码 codepage=936, 英⽂编码codepage=437
shell_id = self.protocol.open_shell(codepage=936)
command_id = self.protocol.run_command(shell_id, command, args)
rs = Response(_command_output(shell_id, command_id))
self.protocol.cleanup_command(shell_id, command_id)
self.protocol.close_shell(shell_id)
return rs
再记⼀些 winrm ⽐较常⽤的命令
winrm 这个命令在服务器端为什么是client的呢?我发现如果按照正常的命令来输⼊的话应该是没有问题的,我相信这个问题不是⼀个很难的问题,因为powershell远程管理windows是系统管理员必备的功能,必须实现,我觉得这⼏种防范已经把问题解决了,我只要慢慢搞应该能搞出来
执⾏以下命令能够以每组多达50个实例的速度获取实例。
winrm set winrm/config @{MaxBatchItems="50"}
此外,通过增⼤分配的最⼤封包⼤⼩和超时设置,也可以提⾼性能。
winrm set winrm/config @{MaxEnvelopeSizekb="150"}
winrm set winrm/config @{MaxTimeoutms ="60000"}
下⾯列出了其他可选的WinRM配置命令,以便您参考。要获取当前的WinRM配置设置,请执⾏以下命令:
winrm g winrm/config
默认情况下,客户端计算机要求对⽹络流量加密。要允许客户端计算机请求未加密流量,请执⾏以下命令:
winrm s winrm/config/Client @{AllowUnencrypted="true"}
TrustedHosts 是⼀个数组,⽤于指定可信的远程计算机的列表。同⼀⼯作组中的其他计算机或不同域中的计算机均应添加到此列表中。
注意:TrustedHosts 列表中的计算机未经过⾝份验证。
执⾏以下命令可将所有计算机都纳⼊TrustedHosts。
winrm s winrm/config/Client @{TrustedHosts="*"}
基本⾝份验证是以明⽂形式将⽤户名和密码发送给服务器或代理的⽅案。这是最不安全的⾝份验证⽅法。默认值为True。
执⾏以下命令可将客户端计算机设置为使⽤基本⾝份验证:
winrm s winrm/config/Client/Auth @{Basic="true"}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论