简单版 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()