|
|
1
216
不通过shell调用的好处是,您不会调用POSIX上的环境变量“神秘程序”
因此,调用shell将调用用户选择的程序,并且依赖于平台。一般来说,避免通过shell调用。 通过shell调用确实允许您根据shell的常规机制扩展环境变量和文件glob。在POSIX系统上,shell将文件全局扩展为文件列表。在Windows上,文件glob(例如“*.*”)无论如何不会由shell展开(而是由命令行上的环境变量展开) 按cmd.exe展开)。
如果您认为需要环境变量扩展和文件全局,请研究
|
|
|
2
176
资料来源: Subprocess Module |
|
|
3
49
这里显示了一个Shell=True可能出错的示例
|
|
|
4
41
通过shell执行程序意味着传递给程序的所有用户输入都将根据所调用shell的语法和语义规则进行解释。充其量,这只会给用户带来不便,因为用户必须遵守这些规则。例如,包含特殊shell字符(如引号或空格)的路径必须转义。最坏的情况是,它会导致安全漏洞,因为用户可以执行任意程序。
|
|
|
5
22
这里的其他答案充分解释了安全注意事项,这些注意事项在
“外显优于内隐”; 通配符扩展、变量插值和重定向都很容易替换为本机Python构造。一个复杂的shell管道,其中部分或全部不能用Python合理地重写,这可能是您可以考虑使用shell的一种情况。您仍然应该确保您了解性能和安全含义。
在琐碎的情况下,要避免
具有
作为旁白,你经常想避免
如果不是,对于许多任务,您需要
最后,我将引用davidkorn的一句话:“编写可移植shell比编写可移植shell脚本更容易。”
|
|
|
6
-1
假设您正在使用shell=False并将命令作为列表提供。一些恶意用户试图注入“rm”命令。 您将看到,“rm”将被解释为一个参数,实际上,“ls”将尝试查找一个名为“rm”的文件
如果您没有正确控制输入,shell=False在默认情况下是不安全的。你仍然可以执行危险的命令。
我在容器环境中编写大多数应用程序,我知道调用哪个shell,并且不接受任何用户输入。 所以在我的用例中,我看不到安全风险。而且创建长的命令串要容易得多。希望我没有错。 |