client端发送shell命令,server端将命令执行结果返回给client端
server端
import socket,subprocess sk = socket.socket() address = ('127.0.0.1',8000) sk.bind(address) sk.listen(3) #这里的3是指允许等待连接的数量 print('waitting......') while True: conn,addr = sk.accept() print(addr) while True: try: data = conn.recv(1024) except Exception as e: #连接后server端会等待client端发送数据,此处加入异常处理是为了防止client端突然终止程序使server端报错 break if not data:break #client发送为空时,断开 print('........',str(data,'utf-8')) obj=subprocess.Popen(str(data,'utf-8'),shell=True,stdout=subprocess.PIPE) cmd_result = obj.stdout.read() result_len=bytes(str(len(cmd_result)),'utf-8') #获取命令执行结果的输出长度 conn.sendall(result_len) #发送命令执行结果的输出长度给client端,让client端判读需要接收多少数据才停止 conn.recv(1024) #这个conn.recv作用是间隔上下两个sendall,防止粘包 conn.sendall(cmd_result) sk.close()
client端
import socket sk = socket.socket() #建立tcp连接 address = ('127.0.0.1',8000) sk.connect(address) while True: inp=input('>>>') if inp == 'exit': #如果输入exit,终止连接 break sk.send(bytes(inp,'utf-8')) #先发送命令 result_len=int(str(sk.recv(1024),'utf-8')) #接收server端返回数据的长度 sk.sendall('OK') print(result_len) data=bytes() #初始化一个变量data用于接收server端返回数据,类型为bytes,初始长度为0 while len(data) != result_len: #判断是否已经接收完server端发来的数据 recv = sk.recv(1024) data+=recv #累加每次接收的数据 print(str(data,'gbk')) #将接收到的数据data转为字符串类型 sk.close()