【发布时间】:2020-02-14 19:38:57
【问题描述】:
我试过了
import subprocess
p = subprocess.Popen("ls -la /etc", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdout.read().decode()
这给了我
FileNotFoundError: [Errno 2] No such file or directory: 'ls -la /etc': 'ls -la /etc'
关注
Python subprocess.Popen with var/args
我做到了
import subprocess
p = subprocess.Popen(["ls", "-la", "/etc"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.stdout.read().decode()
哪个有效。
这是为什么呢?为什么我必须拆分我的命令及其参数?这种设计背后的基本原理是什么?
Python 版本:
3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0]
【问题讨论】:
-
我见过的一个约定是传递你的字符串,但是
split它变成了一个列表:"ls -la /etc".split(' ') -
将参数作为列表给出,也可以包含变量和表达式作为项,允许底层代码确保正确引用并防止shell代码注入漏洞。
-
有趣的是你如何使用
/etc并且错误抱怨~/projects... -
wups更改目录后忘记重新运行代码
-
@KlausD.,“确保正确引用”?它完全阻止了任何需要的引用; shell 引用是一个 shell 结构;使用
shell=False,您只是传递了一个文字 C 字符串列表,因此不需要正确的 或 不正确的引用。
标签: python linux subprocess