use*_*262 4 python shell subprocess
似乎每当我尝试使用Python的子进程模块时,我发现我仍然不理解某些东西.目前,我试图从Python模块中加入3 mp4文件.
当我尝试
z ='MP4Box -cat test_0.mp4 -cat test_1.mp4 -cat test_2.mp4 -new test_012d.mp4'
subprocess.Popen(z,shell=True)
Run Code Online (Sandbox Code Playgroud)
一切正常.
当我尝试
z = ['MP4Box', '-cat test_0.mp4', '-cat test_1.mp4', '-cat test_2.mp4', '-new test_012d.mp4']
subprocess.Popen(z,shell=False)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Option -cat test_0.mp4 unknown. Please check usage
Run Code Online (Sandbox Code Playgroud)
我认为,因为shell=False
我只需要提供一个列表,其中第一个元素是我想要运行的可执行文件,每个后续元素都是该可执行文件的参数.我是否误解了这个信念,或者是否有正确的方法来创建我想要使用的命令?
另外,有没有Shell=True
在subprocess.Popen中使用的规则?到目前为止,我真正知道的(?)是"不要这样做 - 你可以将你的代码暴露给Shell注入攻击".为什么要Shell=False
避免这个问题?使用'Shell = True`是否真的有优势?
Rah*_*pta 12
如果是shell True
,则将通过shell执行指定的命令.如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,文件名通配符,环境变量扩展以及扩展~
到用户的主目录,这将非常有用..
什么时候shell=True
危险?
如果我们执行可能包含来自不受信任源的未经过类型化的输入的 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..
Run Code Online (Sandbox Code Playgroud)
您必须将每个参数作为列表的一个元素:
z = ['MP4Box', '-cat', 'test_0.mp4', '-cat', 'test_1.mp4', '-cat', 'test_2.mp4', '-new', 'test_012d.mp4']
subprocess.Popen(z,shell=False)
Run Code Online (Sandbox Code Playgroud)
这通常是您想要做的,因为您不需要转义文件名中 shell 的特殊字符。
归档时间: |
|
查看次数: |
8274 次 |
最近记录: |