socket 基于tcp实现远程执行命令
server.py
# socket 基于tcp实现远程执行命令 from socket import * import subprocess ip_port = ('127.0.0.1', 8080) back_log = 5 buffer_size = 1024 tcp_server = socket(AF_INET, SOCK_STREAM) tcp_server.bind(ip_port) tcp_server.listen(back_log) while True: conn, addr = tcp_server.accept() while True: try: cmd = conn.recv(buffer_size) if not cmd: break cmd = cmd.decode('utf-8') print('收到客户端命令', cmd) res = subprocess.Popen(cmd, shell=True, # 第一个参数:命令字符串,第二个参数指定由shell处理 stderr=subprocess.PIPE, # 将基本的输入、输出及错误都放入管道 stdin=subprocess.PIPE, # 这些在管道里的信息都是字节形式,编码为utf-8 stdout=subprocess.PIPE ) err = res.stderr.read() # 定义一个err变量接收基本的错误信息 if err: # 如果错误信息不为空 cmd_res = err # 输出的结果为基本的错误信息 else: cmd_res = res.stdout.read() # 输出的结果为基本的输出信息 if not cmd_res: # 有些命令无返回结果,需要进行判断 cmd_res = '该命令没有返回结果'.encode('gbk') conn.send(cmd_res) # 向客户端发送执行的结果 except Exception: break conn.close() tcp_server.close()
client.py
from socket import * ip_port = ('127.0.0.1', 8080) tcp_client = socket(AF_INET, SOCK_STREAM) tcp_client.connect(ip_port) while True: cmd = input('请输入命令').strip() if not cmd: continue if cmd == 'quit': break cmd = cmd.encode('utf-8') tcp_client.send(cmd) cmd_res = tcp_client.recv(1024) # 这里会有粘包现象产生 print('命令执行的结果是', cmd_res.decode('gbk')) # windows系统默认编码为gbk