socket 基于udp实现远程执行命令
server.py
# socket 基于udp实现远程执行命令 from socket import * import subprocess ip_port = ('127.0.0.1', 8080) buffer_size = 1024 udp_server = socket(AF_INET, SOCK_DGRAM) udp_server.bind(ip_port) while True: cmd, addr = udp_server.recvfrom(buffer_size) cmd = cmd.decode('utf-8') print('收到客户端命令', cmd) res = subprocess.Popen(cmd, shell=True, # 第一个参数:命令字符串,第二个参数指定由shell处理 stderr=subprocess.PIPE, # 将基本的输入、输出及错误都放入管道 stdin=subprocess.PIPE, # 这些在管道里的信息都是字节形式,编码为utf-8 stdout=subprocess.PIPE ) err = res.stderr.read() # 定义一个err变量接收基本的错误信息 if err: # 如果错误信息不为空 cmd_res = err # 输出的结果为基本的错误信息 else: cmd_res = res.stdout.read() # 输出的结果为基本的输出信息 if not cmd_res: # 有些命令无返回结果,需要进行判断 cmd_res = '该命令没有返回结果'.encode('gbk') udp_server.sendto(cmd_res, addr) # 向客户端发送执行的结果 udp_server.close()
client.py
from socket import * ip_port = ('127.0.0.1', 8080) buffer_size = 1024 udp_client = socket(AF_INET, SOCK_DGRAM) while True: cmd = input('请输入命令').strip() if not cmd: continue if cmd == 'quit': break cmd = cmd.encode('utf-8') udp_client.sendto(cmd, ip_port) cmd_res, addr = udp_client.recvfrom(buffer_size) # 这里的值过小会接收不全服务端发来的信息 print('命令执行的结果是', cmd_res.decode('gbk')) # windows系统默认编码为gbk udp_client.close()