1 ‘‘‘ 2 远程执行cmd命令程序 3 如果不使用struct模块,ipconfig等会返回长数据的命令会发生黏包现象 4 ‘‘‘ 5 import socket 6 import struct 7 8 sk = socket.socket() 9 sk.bind(("127.0.0.1", 8080)) 10 sk.listen() 11 conn, addr = sk.accept() 12 while True: 13 cmd = input(">>>") 14 if cmd == "q": 15 conn.send(b"q") 16 break 17 conn.send(bytes(cmd,encoding="gbk")) 18 # windows系统的命令行的编码格式是GBK所以要进行GBK转码 19 num = conn.recv(4) 20 # 接收返回数据的长度 21 num = int(struct.unpack("i",num)[0]) 22 # 将接收的bytes类型的struct转换的数字解码,因为返回的是元组所以取元组的第一个,并且下面要用的类型是整数型,转换成int类型 23 print(conn.recv(num).decode("gbk")) 24 # 接收上面传进来大小的数据,解码gbk,打印 25 # 发送多少接收多少就不会产生黏包现象了 26 27 conn.close() 28 sk.close()
server
1 import socket 2 import struct 3 import subprocess 4 5 sk = socket.socket() 6 sk.connect(("127.0.0.1", 8080)) 7 while True: 8 cmd = sk.recv(1024).decode("gbk") 9 # Windows命令行是gbk编码,使用gbk解码 10 if cmd == "q": 11 break 12 res = subprocess.Popen(cmd,shell=True, 13 stdout=subprocess.PIPE, 14 stderr=subprocess.PIPE) 15 # 使用subprocess模块执行cmd命令 16 # 第一个参数是要执行的命令 17 # shell=True 表示执行的是系统shell命令 18 # stdout 执行成功输出信息,保存到管道 19 # stderr 执行失败输出信息,保存到管道 20 stdout = res.stdout.read() 21 # 读取执行成功信息 22 stderr = res.stderr.read() 23 # 读取执行失败信息 24 str_len = len(stdout)+len(stderr) 25 # 取执行成功和失败信息的长度和 26 num = struct.pack("i",str_len) 27 # 使用struct进行数字固定长度编码 28 # “i” 表示进行转换的是int类型 -> 转换完成后会是固定4字节的bytes类型 29 # 第二个参数是长度数字 30 sk.send(num) 31 # 将长度发送 32 sk.send(stdout) 33 # 发送执行成功信息 34 sk.send(stderr) 35 # 发送执行失败信息 36 37 sk.close()
client
原文地址:https://www.cnblogs.com/changjiangwei/p/11378736.html
时间: 2024-10-10 01:56:08