socket编程执行远程命令例子:_python
服务端:
import socket,os,subprocess server=socket.socket() server.bind(('localhost',1234)) #绑定端口 server.listen() #监听 while True: print('等待连接') conn,addr=server.accept() #等客户端,返回值就是连接对象实例,和客户端地址 while True: data=conn.recv(1024) print(data) if not data: #客户端是否断开连接判断 print('已断开连接') break #a=subprocess.Popen(data.decode('utf-8'),shell=True,stdout=subprocess.PIPE) #res=a.stdout.read()#第二种执行命令返回结果的方法 res=os.popen(data.decode('utf-8')).read() #执行命令返回结果 print('res',res) #因为中文的原因,windows上的接收大小与源文件大小不一样需要提前encode if len(res)==0: res='cmd has no output' data_len=len(res.encode()) #这里需要先encode(),然后再计算大小,不然与客户端计算大小方式有出入 print(data_len) conn.send(str(data_len).encode()) #先发送本次结果数据大小给客户端验证 conn.sendall(res.encode()) #相当于循环发送完整结果
客户端:
import socket client=socket.socket() #声明socket类型,生成对象 client.connect(('localhost',1234)) while True: msg=input('>>') if len(msg)==0:continue client.send(msg.encode('utf-8')) #只能发送bytes类型 data_len=client.recv(1024) print(data_len) receive_len=0 while int(data_len.decode())>receive_len: #循环完整接收本次命令的结果 data=client.recv(10240) receive_len=receive_len+len(data) print(receive_len) print(str(data,'utf-8')) client.close()