基于tcp的套接字实现远程执行命令的操作
——客户端敲命令,服务端执行
#服务端 import socket import subprocess phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) ip_port=("127.0.0.1",8080) phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(ip_port) phone.listen(5) while True: conn,addr=phone.accept() print(addr) while True: try: cmd=conn.recv(1024) res=subprocess.Popen(cmd.decode("utf8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #注释掉的这么多行,是因为在linux系统下同时执行多条命令,命令中如果有对有错的话res.stderr.read()和res.stdout.read()都会有返回值。 #err=res.stderr.read() #if err: # cmd_res=err #else: # cmd_res=res.stdout.read() #conn.send(cmd_res) #修改为: conn.send(res.stdout.read()) conn.send(res.stderr.read()) except Exception: break conn.close() phone.close()
#客户端 import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(("192.168.85.129",8080)) while True: cmd=input(">>:").strip() if not cmd:continue phone.send(cmd.encode("utf8")) data=phone.recv(8192) #当命令行打印的东西太长时,接收超过1024,所以这里修改为8192 print(data.decode("utf8")) #当服务端运行在linux系统下,为utf8;服务端在windows下运行时,为gbk phone.close()
当服务端运行在Windows系统下,若客户端发送给服务端识别window系统的命令,服务端将执行windows系统命令的结果发送给客户端显示,不能识别的则发送错误信息给客户端。
同样当服务端在linux系统下运行,若客户端发送给服务端识别linux系统的命令,服务端将执行windows系统命令的结果发送给客户端显示,不能识别的则发送错误信息给客户端。