Python执行命令模块 subprocess
Python可以使用subprocess下的Popen类中的封装的方法来执行命令
API方法
- 构造方法 popen() 创建popen类的实例化对象
···
obj = Subprocess.Popen(data,shell=True,stdout=subprocess.PIPE) - data 命令内容
- shell 开启shell
- stdout 重定向结果输出管道
* PIPE 将结果转移到当前主进程
*
··· - stdout.read() 获取命令执行的结果,指定结果后会将执行结果封装到指定的对象中,然后通过对象,read()获取执行命令的结果,如果不定义stdout会将结果进行标准输出
import subprocess
popen = subprocess.Popen('pwd',shell=True,stdout=subprocess.PIPE)
print(popen.stdout.read())
通过socket远程调用执行命令并返回结果
- server
'''
通过socket远程调用执行命令并返回
'''
import socket
# 创建socket对象
import subprocess
sk = socket.socket()
address = ('127.0.0.1', 8000)
# 绑定地址
sk.bind(address)
sk.listen(3)
conn, address = sk.accept()
while 1:
# 接收数据
data = conn.recv(1024)
# 转换字符串
cm_data = str(data, 'utf8')
print(cm_data)
# 执行命令
sp = subprocess.Popen(cm_data, shell=True, stdout=subprocess.PIPE)
run_result = sp.stdout.read()
# 为了将数据全部发送 先发送长度
run_result_len = len(run_result)
conn.sendall(bytes(str(run_result_len), 'utf8'))
# 将命令执行结果发送回去
conn.sendall(run_result)
conn.close()
sk.close()
- client
'''
远程执行命令客户端
'''
import socket
sk = socket.socket()
address = ('127.0.0.1', 8000)
# 设置地址
sk.connect(address)
while True:
# 发送数据
inpt = input('>>>')
# 数据转换
input_byte = bytes(inpt, 'utf8')
# 发送数据
sk.sendall(input_byte)
# 接收返回结果的长度
len_recv = sk.recv(1024)
print(len_recv)
run_len = int(str(len_recv, 'utf8'))
print("run_len" + str(run_len))
# 存放接收数据的容器变量
recv_data = bytes()
while len(recv_data) != run_len:
data = sk.recv(1024)
recv_data += data
# 接收数据
run_result = str(recv_data, 'utf8')
print(run_result)
sk.close()