您的位置:首页 > 运维架构 > Shell

subprocess shell=True的测试

2015-07-29 11:03 639 查看
最近用到了python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下:

from subprocess import call
import shlex

cmd = "cat test.txt; rm test.txt"
call(cmd, shell=True)


运行之后:

1:打开并浏览了test.txt文件

2:删除了test.txt文件

from subprocess import call
import shlex

cmd = "cat test.txt; rm test.txt"
cmd = shlex(cmd)
call(cmd, shell=False)


运行之后:

1:尝试打开名为text.txt;的文件

2:尝试打开名为rm的文件

3:打开并浏览了test.txt文件

shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,第一个测试中的分号被认为是shell命令中的分隔符,执行了cat和rm两个命令。

当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数,因此第二个测试只执行了cat命令,并试着打开了作为参数的”text.txt;”,”rm” , “text.txt”三个文件。

毫无疑问shell=False的参数能让你的程序更加安全,尤其是当你的cmd变量值是从外部读取到的时候。

假设你有这样的一个需求:让程序运行cat命令,cat的参数则是从一个文件里读取,那代码可能是这样子的

from subprocess import call

param = file.readline()
call(cat + param, shell = True)


一旦当param读取到了”a.txt; rm -rf /;b.txt”之类的字符串时,后果时毁灭性的……

from subprocess import call
import shlex

param = file.readline()
param = "cat " + param
param = shlex(param)
call(param, shell = False)


显然是更好的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息