python中的输出shell命令


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 .

相关内容

  • 没有找到相关文章

最新更新