我找到了子进程模块,其中你加载一个列表而不是一个字符串(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)
有效。为什么呢?
答案 0 :(得分:-1)
这只是命令的格式。在不经过shell的情况下进行解析时,它会分别遍历每个命令和参数。但是当解释器被告知只使用gnome-shell(它在解析整个命令字符串方面要好得多而且对于间距是挑剔的时候),命令的格式会改变以反映出来。此解析问题反映在安全隐患中,该安全隐患是由未经过抽取的输入直接泵送到shell进程引起的。来自the docs:
执行包含来自不受信任源的未经过处理的输入的shell命令会使程序容易受到shell注入攻击,这是一个严重的安全漏洞,可能导致任意命令执行。因此,在从外部输入构造命令字符串的情况下,强烈建议不要使用
shell=True
: