winrm是Windows基于Web服务管理(WS-Management)标准,使用80端口或者443端口实现的,用于windows服务器进行管理并获取数据的一个服务。
https://blog.csdn.net/cqcre/article/details/124743241
https://blog.csdn.net/qq_31489933/article/details/114750172
需要在服务设备上打开winrm服务
//查看winrm指令
winrm
//快速在服务端运行winrm
winrm quickconfig
//查看winrm的运行情况 并记住当前服务端口号
winrm e winrm/config/listener
//查看 winrm 全部配置信息(可选)
winrm get winrm/config
//查看client 客户端配置信息(可选)
winrm get winrm/config/client
//查看service 服务端配置信息(可选)
winrm get winrm/config/service
安装winrm库环境
pip install winrm
使用python库winrm
# 连接windows
import winrm
import codecs
# ip地址:端口号
# winrm server端口号
# auth:用户名和密码
win_local = winrm.Session("10.237.XXX.XXX:xxxx", auth=('username', 'password'), transport='ntlm')
def exec_cmd(self, cmd):
"""
执行cmd命令,获取返回值
:param cmd:
:return:
"""
# CMD
result = self.run_cmd(cmd)
# powerShell
# result = self.session.run_ps(cmd)
# 返回码
# code为0代表调用成功
code = result.status_code
# 根据返回码,获取响应内容(bytes)
content = result.std_out if code == 0 else result.std_err
# 转为字符串(尝试通过UTF8、GBK进行解码)
# result = content.decode("utf8")
# result = codecs.decode(content,'UTF-8')
try:
result = content.decode("utf8")
except:
result = content.decode("GBK")
print(result)
return result
...
# 打开文件执行ipconfig命令
result = exec_cmd(win_local, 'ipconfig')
在同一局域网下,其他主机和本机都可以连接并执行命令
进如windows服务中停止windows remote服务
即可
https://zhuanlan.zhihu.com/p/411140303
#服务端
import socket
import threading
import numpy as np
import cv2
import os
#鼠标点击事件
def mouse_click(event, x, y, flags, para):
if event == cv2.EVENT_LBUTTONDOWN: # 左边鼠标点击
f=open("1.txt","w")
f.write(str(x)+","+str(y))
f.close()
print(str(x)+","+str(y))
#接收客户端桌面信息
def recv_msg(clientsocket):
while True:
# 接受客户端消息,设置一次最多接受10240字节的数据
recv_msg = clientsocket.recv(102400)
# 把接收到的东西解码
#不推荐使用fromstring的二进制模式,因为它在unicode输入上的表现令人惊讶。改用fromfuffer
msg = np.fromstring(recv_msg, np.uint8)
# msg = np.fromfuffer(recv_msg, np.uint8)
img_decode = cv2.imdecode(msg, cv2.IMREAD_COLOR)
try:
s=img_decode.shape
img_decode=img_decode
temp=img_decode
except:
img_decode=temp
pass
cv2.imshow('SERVER', img_decode)
cv2.setMouseCallback("SERVER", mouse_click)
try:
f=open("1.txt")
txt=f.read()
f.close()
reply=txt
print(reply)
clientsocket.send(reply.encode('utf-8'))
os.remove("1.txt")
except:
pass
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#通讯连接
def socket_bind_listen(host,port):
#创建ipv4的socket对象,使用TCP协议(SOCK_STREAM)
socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_server.bind((host, port))
# 设置最大监听数,也就是最多可以同时响应几个客户端请求,一般配合多线程使用
socket_server.listen(5)
# 等待客户端连接,一旦有了连接就立刻向下执行,否则等待
# accept()函数会返回一个元组,第一个元素是客户端socket对象,第二个元素是客户端地址(ip地址+端口号)
clientsocket, addr = socket_server.accept()
# 有了客户端连接后之后才能执行以下代码,我们先向客户端发送连接成功消息
clientsocket.send('连接成功'.encode('utf-8'))
# 和客户端一样开启一个线程接受客户端的信息
#class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
#target: 传一个回调函数对象
#如果回调函数对象需要传递参数的话,args 是固定参数,kwargs 是可变参数
#args=()中的,不能省略
t = threading.Thread(target=recv_msg, args=(clientsocket,))
t.start()
if __name__ == '__main__':
host = '0.0.0.0'
# 设置被监听的端口号,小于1024的端口号不能使用
port = 4000
print("等待连接---")
socket_bind_listen(host,port)
#客户端
import socket
import threading
import cv2
import numpy as np
from PIL import ImageGrab
from pynput.mouse import Button,Controller
#接受服务器返回的数据的函数
m = Controller()
def recvlink(client):
while True:
msg=client.recv(1024)
msg=msg.decode('utf-8')
print(msg)
key = msg.split(",")
xp = int(key[0])
yp = int(key[1])
m.position = ((xp,yp))
m.click(Button.left,1)
#创建ipv4的socket对象,使用TCP协议(SOCK_STREAM)
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置服务器ip地址,注意应该是服务器的公网ip
host='0.0.0.0'
#设置要发送到的服务器端口,需要在云服务器管理界面打开对应端口的防火墙
port=4000
#建立TCP协议连接,这时候服务器就会监听到到连接请求,并开始等待接受client发送的数据
client.connect(("127.0.0.1", 4000))
#建立连接后,服务器端会返回连接成功消息
start_msg=client.recv(1024)
print(start_msg.decode('utf-8'))
#开启一个线程用来接受服务器发来的消息
t=threading.Thread(target=recvlink,args=(client,))
t.start()
p = ImageGrab.grab()#获得当前屏幕
quality = 25 # 图像的质量
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
while True:
im = ImageGrab.grab()
imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)#转为opencv的BGR格式
imm = cv2.resize(imm, (1535, 863))
img_encode = cv2.imencode(".jpg", imm, encode_param)[1]
data_encode = np.array(img_encode)
#tostring()已经弃用替换为tobytes()
# str_encode = data_encode.tostring()
str_encode = data_encode.tobytes()
#print(len(str_encode))
#输入要发送的信息
sendmsg="kehu"
#向服务器发送消息
client.send(str_encode)
if sendmsg=='quit':
break
#结束时关闭客户端
client.close()
https://blog.csdn.net/icamera0/article/details/50763010/
ImageGrab模块用于将当前屏幕的内容或者剪贴板上的内容拷贝到PIL图像内存。
1、 Grab
定义:ImageGrab.grab() ⇒ image
ImageGrab.grab(bbox) ⇒ image
含义:(New in 1.1.3)抓取当前屏幕的快照,返回一个模式为“RGB”的图像。参数边界框用于限制只拷贝当前屏幕的一部分区域。
>>> from PIL importImage, ImageGrab
>>> im =ImageGrab.grab()
>>> im.size
(1366, 768)
>>> im.mode
'RGB'
>>> im.show()
>>> im0 =ImageGrab.grab((300, 100, 1400, 600))
>>> im0.show()
>>> im0.size
(1100, 500)
>>> im0.mode
'RGB'
fromstring()
从字符串中的文本数据初始化的新一维数组
tobytes()
将数组转换为机器值数组并返回字节表示。
img.size
为(宽,高)
arry_img.shape
为(高,宽,通道数)
arry_img.size
为 高x宽x通道数 的总个数