我正在使用Python脚本来调用Java虚拟机。以下命令有效:
subprocess.call(["./rvm"], shell=False) # works
subprocess.call(["./rvm xyz"], shell=True) # works
但是,
subprocess.call(["./rvm xyz"], shell=False) # not working
无法正常工作。 Python文档建议避免使用shell=True
。
我正在使用Python脚本来调用Java虚拟机。以下命令有效:
subprocess.call(["./rvm"], shell=False) # works
subprocess.call(["./rvm xyz"], shell=True) # works
但是,
subprocess.call(["./rvm xyz"], shell=False) # not working
无法正常工作。 Python文档建议避免使用shell=True
。
shell=True
,这是合法的,否则它将从标准库中删除。文档并没有建议避免使用它,而是说道:
但在你的情况下,你不是从用户输入构建命令,你的命令是固定的,所以你的代码不会出现 shell 注入 问题。你可以控制 shell 将要执行的内容,如果你的代码本身不恶意,那么就是安全的。执行包含未经过滤的来自不受信任来源的输入的 shell 命令会使程序易受 shell 注入攻击,这是一个严重的安全漏洞,可能导致任意命令执行。因此,在命令字符串由外部输入构建的情况下,强烈不建议使用
shell=True
。
>>> from subprocess import call
>>> filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / #
>>> call("cat " + filename, shell=True) # Uh-oh. This will end badly...
根据您提供的额外信息,编辑问题时,请遵循Padraic的答案。只有在必要时才应使用shell=True
。
shell=True
,给它一个完整的命令字符串;使用shell=False
,给它一个列表。*.jpg
或2> /dev/null
之类的shell技巧,请使用shell=True
; 但一般情况下我建议使用shell=False
--正如Enrico所说,这样更耐用。
import subprocess
subprocess.check_call(['/bin/echo', 'beer'], shell=False)
subprocess.check_call('/bin/echo beer', shell=True)
beer
beer
不要使用文件名目录,而是在其前面添加单词python
,前提是您已将Python路径添加到环境变量中。如果您不确定,可以重新运行Python安装程序,前提是您有新版本的Python。
这就是我的意思:
import subprocess
subprocess.Popen('python "C:/Path/To/File/Here.py"')
shell=False
时需要参数列表而在shell=True
时字符串就可以工作吗?我听说当有输入时,shell=True
非常危险,所以我试图避免使用它。 - Tommyshell
如何,都传递相同的参数。 - Tommy