python 的 pywinrm 模块远程连接 windows 执行 dos 命令
最近遇到项目需要使用 windows 服务器,之前分开部署,先需求 linux 连接 windows,使用 winrm 即可
—-A 机器远程连接 B—-
在 A 机器(Linux)上安装模块:
pip install pywinrm
在 B 机器上配置 winrm 服务的相关配置,使其支持远程控制:
(winrm 服务是 windows 一种方便远程管理的服务;开启 winrm service, 便于在日常工作中,远程管理服务器,或通过脚本,同时管理多台服务器,来提高工作效率;)
一、配置 windows winrm
1. 运行如下,如果没有返回,则没有开启 winrm
PS C:\Users\Administrator> winrm enumerate winrm/config/listener
2. 配置 winrm 基础配置
PS C:\Users\Administrator> winrm quickconfig
已在此计算机上运行 WinRM 服务。
WinRM 没有设置成为了管理此计算机而允许对其进行远程访问。
必须进行以下更改:在 HTTP://* 上创建 WinRM 侦听程序接受 WS-Man 对此机器上任意 IP 的请求。
配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。执行这些更改吗 [y/n]? y
WinRM 已经进行了更新,以用于远程管理。
在 HTTP://* 上创建 WinRM 侦听程序接受 WS-Man 对此机器上任意 IP 的请求。
已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。
3. 查看 windows 的 winrm service listener
PS C:\Users\Administrator> winrm e winrm/config/listener
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 127.0.0.1, 172.18.232.248, ::1, fe80::5efe:172.18.232.248%12, fe80::4963:ce66:e004:e54%17
4. 配置 winrm auth
PS C:\Users\Administrator> winrm set winrm/config/service/auth '@{Basic="true"}'
Auth
Basic = true
Kerberos = true
Negotiate = true
Certificate = false
CredSSP = false
CbtHardeningLevel = Relaxed
5. 配置 winrm service 加密方式为允许非加密
PS C:\Users\Administrator> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Service
RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
MaxConcurrentOperations = 4294967295
MaxConcurrentOperationsPerUser = 1500
EnumerationTimeoutms = 240000
MaxConnections = 300
MaxPacketRetrievalTimeSeconds = 120
AllowUnencrypted = true
Auth
Basic = true
Kerberos = true
Negotiate = true
Certificate = false
CredSSP = false
CbtHardeningLevel = Relaxed
DefaultPorts
HTTP = 5985
HTTPS = 5986
IPv4Filter = *
IPv6Filter = *
EnableCompatibilityHttpListener = false
EnableCompatibilityHttpsListener = false
CertificateThumbprint
AllowRemoteAccess = true
二、在 linux 连接
1.python 脚本
#!/usr/bin/python
import winrm
win2008 = winrm.Session('http://B主机的ip地址:5985/wsman',auth=('administrator','xxxx'))
r = win2008.run_cmd('cd .. & dir')
print r.std_out.decode()
print r.std_err
2. 运行
# python winP.py
Volume in drive C has no label.
Volume Serial Number is 50E1-E273
Directory of C:\Users
2018/07/10 10:10 <DIR> .
2018/07/10 10:10 <DIR> ..
2018/07/06 08:57 <DIR> Administrator
2009/07/14 12:57 <DIR> Public
2018/07/11 18:21 <DIR> seedeer
0 File(s) 0 bytes
5 Dir(s) 252,649,209,856 bytes free