大家都知道python中需要执行shell命令时,有shell=True和shell=False两种方式。但是shell=True的方式不安全,为了保证安全性,一般使用shell=False的方式。shell=False的方式虽然安全,但它一次只能执行一个命令,有管道符号的命令需要拆分成多个命令分别执行,这里写了一个执行多条命令的方法将执行多条命令的操作封装起来,只需要传入需要执行的命令,就能返回需要的结果,代码如下:
import shlex
import subprocess
from subprocess import PIPE
def multiple_cmd_exec(cmds):
print("Enter multiple_cmd_exec")
process_list = []
try:
for index, cmd in enumerate(cmds):
if index == 0:
_p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
else:
_p = subprocess.Popen(cmd, stdin=process_list[index-1].stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process_list.append(_p)
out, err = process_list[-1].communicate()
if process_list[-1].returncode == 0:
print("multiple_cmd_exec success:\n{}".format(out.decode()))
else:
print("multiple_cmd_exec err:\n{}".format(err.decode()))
return out.decode()
except Exception as error:
print(error)
def change_cmds_format(args):
print("Enter change_cmds_format")
cmds = []
result = []
if '|' in args:
cmds = args.split('|')
else:
cmds.append(args)
for cmd in cmds:
cmd = shlex.split(cmd)
result.append(cmd)
print(result)
return result
cmd = "netstat -ant | awk '{print $6}' | sort|uniq -c|sort -rn"
cmds = change_cmds_format(cmd)
ret = multiple_cmd_exec(cmds)
print(ret)
运行结果如下: