Python subprocess,使用shell参数

5
观察http://docs.python.org/2/library/subprocess.html#frequently-used-arguments,我假设除非使用shell=True,否则无法使用rmcpmv等命令。也许文档已过时,因为他们正在使用字符串提供的call方法,而应该是列表。但使用shell=False并不会阻止使用这些shell命令。

shell=False禁用所有基于shell的功能。

在查看subprocess.py之后,我可以看到该参数所做的全部工作只是将["/bin/sh", "-c"]添加到参数字符串的开头。

有人能为我澄清这个问题吗?


3
如果你要使用rmcpmv等命令,那么你真的没有理解好Python的用法。试着使用os和shutil模块中内置的众多跨平台方法。 - Alastair McCormack
我非常了解这些内容并经常使用它们,我正在编写一些需要防止被 shell 命令黑客攻击的代码,比如上面提到的那些命令。 - joedborg
请接受我的道歉。请记住,这些命令不是 shell 的一部分(就像在 DOS 中一样),而是在 /bin 中的可执行文件。Shell 有时会有替代品,比如 Bash 中的 echo。祝你好运 :) - Alastair McCormack
你真的不想执行从用户传递过来的任意命令,除非他们是你正在帮助他们使用你的工具进行管理的系统的所有者。 - Steve Mayne
我猜这就是OP假设使用shell=False来防止那种情况的全部意义,经过进一步了解之后,他想知道如果不是正好这个选项,还有哪些其他好处呢!;-) 个人见解。 - Don Question
这是为公司的内部网络设计的,不必担心被黑客攻击,只需要进行基本的过滤处理即可。 - joedborg
1个回答

6
他们所说的shell功能包括一些像管道符|,通配符*以及其他类似的通配符,标准输出/错误输出重定向使用>2><(进程替换)等。他们并未涉及像mv、grep等其他命令/程序。

或者像 cd 这样的东西。请注意,在其他系统上,比如 Windows,可能没有 mv 等可执行文件,因此您可能需要在 shell 上下文中执行它才能使其正常工作。但是对于文件操作,最好使用 Python 的内置函数。 - poke
+1 嗯,我刚刚查看了一下,现在可以看到区别了。谢谢,超时后会标记为答案。 - joedborg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接