3.服务端远程执行客户端命令
本次的内容为使用socket,来完成客户端发送命令,服务端接收命令,并将命令执行的结果显示在结果中。
需要在服务端使用subprocess来执行服务端的语句
#客户端代码: import socket sk=socket.socket() address=('127.0.0.1',8000) sk.connect(address) while 1: data=bytes(input('想让服务端执行什么:'),encoding='utf-8') if data == bytes('exit', encoding='utf-8'): break sk.send(data) result_len=int(sk.recv(10).decode('utf-8')) #收取服务端发送的长度,解码后转成int类型 recv=sk.recv(result_len+10).decode('gbk') #根据收取数据的长度,来设置一次收取数据的大小,动态设置长度,节省内存和加快运行 print(recv) #打印服务端发送的指令执行的结果 sk.close() print('结束')
服务端程序: import socket import subprocess sk=socket.socket() address=('127.0.0.1',8000) sk.bind(address) sk.listen(3) print('waiting...') while 1: con,add=sk.accept() while 1: try: data = con.recv(1024) except Exception: break if not data: break print('命令为:' + data.decode('utf-8')) obj=subprocess.Popen(data.decode('gbk'),shell=True,stdout=subprocess.PIPE) #将执行命令的结果封装成一个对象,stdout=subprocess.PIPE一定要加,它将命令行的结果拦截,封装在自己的对象里 ret=obj.stdout.read() #读取对象中的结果 result_len=bytes(str(len(ret)),encoding='utf-8') #获取结果的长度并转成字节类型 con.send(result_len) # 告诉服务器发送内容的长度 con.sendall(ret) #发送命令执行的结果 两个send在一起会发生粘包现象,解决方法是将两个send之间加入一个recv阻塞一下 sk.close()

浙公网安备 33010602011771号