为什么subprocess.call([“module”,“list”])失败?

时间:2016-07-01 23:41:06

标签: python subprocess

我找到了子进程模块,其中你加载一个列表而不是一个字符串(shell = True)真的很令人沮丧。直观地说,subprocess.call([“module”,“list”])应该可以工作,但它不会产生这个:

  File "test.py", line 45, in main
    subprocess.call(["module","list"])
  File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
  OSError: [Errno 2] No such file or directory

然而,subprocess.call("module list", shell=True)有效。为什么呢?

1 个答案:

答案 0 :(得分:-1)

这只是命令的格式。在不经过shell的情况下进行解析时,它会分别遍历每个命令和参数。但是当解释器被告知只使用gnome-shell(它在解析整个命令字符串方面要好得多而且对于间距是挑剔的时候),命令的格式会改变以反映出来。此解析问题反映在安全隐患中,该安全隐患是由未经过抽取的输入直接泵送到shell进程引起的。来自the docs

  

执行包含来自不受信任源的未经过处理的输入的shell命令会使程序容易受到shell注入攻击,这是一个严重的安全漏洞,可能导致任意命令执行。因此,在从外部输入构造命令字符串的情况下,强烈建议不要使用shell=True