1.python运行shell命令要用到一个模块subpross。模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码
如:在cmd执行ipconfig命令
import subprocess # 创建子程序 subprocess_obj = subprocess.Popen(‘ipconfig‘, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) ‘‘‘当shell=True时,表示在系统默认的shell环境中执行新的进程,此shell在windows表示为cmd.exe,在linux为/bin/sh subprocess.PIPE表示打开标准流的管道 stdout从子进程捕获到的标准输出. 一个字节序列, 或一个字符串 stderr捕获到的子进程的标准错误. 一个字节序列, 或者一个字符串, ‘‘‘ stdout_res = subprocess_obj.stdout.read() # 读取输出结果。标准输出是byte类型 stderr_res = subprocess_obj.stderr.read() print(stdout_res.decode(‘gbk‘))#windows默认编码为gbk print(stderr_res.decode(‘gbk‘))
2.有了subpross,在上两次课的基础上修改即可。
#服务端 import socket import subprocess socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket_obj.bind((‘127.0.0.1‘, 8080)) socket_obj.listen(5) while True: fd, addr = socket_obj.accept() try: while True: cmd = fd.recv(1024) obj = subprocess.Popen( cmd.decode(‘utf8‘), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout_res = obj.stdout.read() # 标准输出是byte格式,widows是gbk编码 stderr_res = obj.stderr.read() print(stdout_res.decode(‘gbk‘)) print(stderr_res.decode(‘gbk‘)) fd.send(stdout_res) fd.send(stderr_res) except ConnectionResetError: print(‘客户端关闭‘) fd.close()
#客户端 import socket client_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_obj.connect((‘127.0.0.1‘, 8080)) while True: cmd = input(‘请输入cmd命令:‘).strip() if not cmd: continue client_obj.send(cmd.encode(‘utf8‘)) cmd_res = client_obj.recv(1024) print(cmd_res.decode(‘gbk‘))
如果客户端运行的结果比较大,超过了recv的大小,客户端接收不干净,造成粘包了,怎么处理呢?
python基础—socket套接字(4)基于tcp实现远程执行命令
原文:https://www.cnblogs.com/liaoyifu/p/14197875.html