简单版 ssh
# Server import json import socket # 建立socket,监听 import struct import subprocess ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ss.bind(('127.0.0.1', 8080)) ss.listen(5) print("server listen.....") # 接受信息 while True: conn, client_addr = ss.accept() print(client_addr) while True: #通信开始 try: cmd = conn.recv(1024) if not cmd: break # 执行命令 obj = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr= subprocess.PIPE) stdout = obj.stdout.read() stderr = obj.stderr.read() # 执行命令,并发送执行结果 # 第一步:制作固定长度的报头 header_dic = { 'filename': 'a.txt', 'md5': '654444444654545535354', 'total_size': len(stderr) + len(stdout) } header_json = json.dumps(header_dic) header_bytes = header_json.encode('utf-8') # 第二步:先发送报头长度 conn.send(struct.pack('i', len(header_bytes))) # 第三步:发送报头 conn.send(header_bytes) # 第四步:发送真实的数据 conn.send(stdout) conn.send(stderr) except ConnectionResetError: break conn.close() ss.close()
# client import json import socket # 创建socket import struct ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ss.connect(('127.0.0.1', 8080)) # 发送信息 while True: cmd = input('input your cmd: ').strip() if not cmd: continue ss.send(cmd.encode('utf-8')) # 接受信息 # 第一步:接受报头长度 obj = ss.recv(4) header_size = struct.unpack('i', obj)[0] # 第二步:再接受报头 header_bytes = ss.recv(header_size) # 第三步:从报头中解析出对真实数据的描述信息 header_json = header_bytes.decode('utf-8') header_dic = json.loads(header_json) print(header_dic) total_size = header_dic['total_size'] # 第四步:接受真实的数据 recv_size = 0 recv_data = b'' while recv_size < total_size: res = ss.recv(1024) recv_data += res recv_size += len(res) print(recv_data.decode('gbk')) ss.close()