【基于python的远程控制的实现】

目录

  • 基于python的远程控制的实现学习
    • 利用winRM
      • 参考地址
      • 实现-服务端配置
      • 客户端通过python连接
      • 关闭服务
    • 基于socket通信
      • 参考地址
      • 实现-服务端配置
      • 实现-客户端配置
      • thread
      • pil.imagegrab
        • 参考文章
        • 说明
        • 函数
    • PIL获取图像尺寸size 以及与 numpy中size()函数

基于python的远程控制的实现学习

利用winRM

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
  1. 需要将当前网络设置为专用网络。
  2. 需要以管理员权限执行winrm命令
//查看winrm的运行情况  并记住当前服务端口号
winrm e winrm/config/listener

//查看 winrm 全部配置信息(可选)
winrm get winrm/config

//查看client 客户端配置信息(可选)
winrm get winrm/config/client

//查看service 服务端配置信息(可选)
winrm get winrm/config/service

客户端通过python连接

安装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服务即可

基于socket通信

参考地址

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()

thread

pil.imagegrab

参考文章

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()将数组转换为机器值数组并返回字节表示。

PIL获取图像尺寸size 以及与 numpy中size()函数

img.size为(宽,高)
arry_img.shape为(高,宽,通道数)
arry_img.size为 高x宽x通道数 的总个数

你可能感兴趣的:(网络安全)