def run_command(command):
p = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
return p.communicate()
跑步时 :
command = ("git clone " + repo).split()
run_command(commmnd)
一切都在正常。但是当我尝试运行多个命令时,出现错误。
command = ("git clone www.myrepo.com/etc:etc && cd etc && git stash && git pull).split()
run_command(command)
将 subprocess.check_output()
与 shell=True
选项一起使用,但如果它适用于您,请注意不受信任输入的安全警告。
import subprocess
command = 'git clone www.myrepo.com/etc:etc && cd etc && git stash && git pull'
try:
output = subprocess.check_output(command, shell=True)
except subprocess.CalledProcessError as exc:
print("subprocess failed with return code {}".format(exc.returncode))
print("message: {}".format(exc.message))
在此之后output
包含已执行进程的组合标准输出(如果成功)。否则,您需要处理 CalledProcessError 异常。
或者,如果不能保证命令字符串是安全的,则可以依次执行每个命令,仅当当前命令的返回码为 0 时,才进行到下一个命令,即 CalledProcessError
没有提出。
import subprocess
import shlex
command = 'git clone www.myrepo.com/etc:etc && cd etc && git stash && git pull'
output = []
try:
for cmd in command.split('&&'):
output.append(subprocess.check_output(shlex.split(cmd)))
except subprocess.CalledProcessError as exc:
print("{!r} failed with return code {}".format(' '.join(exc.cmd), exc.returncode))
else:
print(''.join(output))
虽然这在 shell 命令注入方面更安全,但其他用户仍然有可能嗅探敏感参数,例如使用 ps
.