python中 subprocess shell=False 与shell=True的区别
2017-05-28 20:02
579 查看
shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。
举个例子来说明:
上述脚本中,shell=True的设置,最终效果是执行了两个命令
cat test.txt 和 rm test.txt
把shell=True 改为False,
则调用call的时候,只会执行cat的命令,且把 "test.txt;" "rm" "test.txt" 三个字符串当作cat的参数,所以并不是我们直观看到的好像有两个shell命令了。
也许你会说,shell=True 不是很好吗,执行两个命令就是我期望的呀。但其实,这种做法是不安全的,因为多个命令用分号隔开,万一检查不够仔细,执行了危险的命令比如 rm -rf / 这种那后果会非常严重,而使用shell=False就可以避免这种风险。
总体来说,看实际需要而定,官方的推荐是尽量不要设置shell=True。
举个例子来说明:
from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True)
上述脚本中,shell=True的设置,最终效果是执行了两个命令
cat test.txt 和 rm test.txt
把shell=True 改为False,
from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" cmd = shlex(cmd) call(cmd, shell=False)
则调用call的时候,只会执行cat的命令,且把 "test.txt;" "rm" "test.txt" 三个字符串当作cat的参数,所以并不是我们直观看到的好像有两个shell命令了。
也许你会说,shell=True 不是很好吗,执行两个命令就是我期望的呀。但其实,这种做法是不安全的,因为多个命令用分号隔开,万一检查不够仔细,执行了危险的命令比如 rm -rf / 这种那后果会非常严重,而使用shell=False就可以避免这种风险。
总体来说,看实际需要而定,官方的推荐是尽量不要设置shell=True。
相关文章推荐
- python subprocess参数shell=True踩到的坑
- 如何结束一个python启动的shell子进程(How to terminate a python subprocess launched with shell=True)
- Python subprocess执行持续输出shell命令的控制
- Python subprocess.Popen communicate() 和wait()使用上的区别
- Python subprocess,Linux下执行shell命令
- 利用python执行shell脚本 并动态传参 及subprocess基本使用
- Python subprocess shell 编程规范
- Python subprocess shell 编程规范
- subprocess shell=True的测试
- Python subprocess shell 丢失环境变量
- Python执行shell脚本的几种方式(最好用subprocess.Popen来替代os.system)
- python3 获得shell的输出内容(subprocess.getstatusoutput)
- python中os.system、os.popen、subprocess.popen的区别
- js中return;、return true、return false;区别
- ajax中async设置为false与true的区别
- pandas.DataFrame.drop_duplicates后面inplace=True与inplace=False的区别
- js中return;、return true、return false;区别
- python subprocess 学习记录
- request.getSession(true)和request.getSession(false)的区别
- UpdateData(TRUE)和UpdateData(FALSE)的区别