详谈python中subprocess shell=False与shell=True的区别

 更新时间:2021年04月23日 08:38:05   作者:逍遥自在017  
这篇文章主要介绍了详谈python中subprocess shell=False与shell=True的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。

举个例子来说明

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参数问题

昨天调试其他同学的代码时,发现对于subprocess模块所传的args变量,与shell变量存在关联,传值不当会有各种问题。比较有趣,就记录一下。

根据subprocess模块的args定义如下:

args is required for all calls and should be a string, or a sequence of program arguments. Providing a sequence of arguments is generally preferred, as it allows the module to take care of any required escaping and quoting of arguments (e.g. to permit spaces in file names). If passing a single string, either shell must be True (see below) or else the string must simply name the program to be executed without specifying any arguments.

对于args,可传string,也可传list,但当传string时,shell的值必须设为True。

当shell为True时

If shell is True, the specified command will be executed through the shell. This can be useful if you are using Python primarily for the enhanced control flow it offers over most system shells and still want convenient access to other shell features such as shell pipes, filename wildcards, environment variable expansion, and expansion of ~ to a user’s home directory.

就是调用了系统的 sh 来执行命令(args的string),这样会导致一些的安全问题,类似于SQL Injection攻击:

from subprocess import call
filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / #
call("cat " + filename, shell=True) # Uh-oh. This will end badly...

所以,安心用shell=False吧,记得args传list。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • python实现的各种排序算法代码

    python实现的各种排序算法代码

    python实现的各种排序算法,包括选择排序、冒泡排序、插入排序、归并排序等,学习python的朋友可以参考下
    2013-03-03
  • Python进行图片信息提取并重命名

    Python进行图片信息提取并重命名

    Tesseract-OCR是一款优秀的开源OCR软件,本文主要介绍了如何使用Tesseract-OCR工具识别图片并提取信息,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • Python轻量级Web框架之Flask用法详解

    Python轻量级Web框架之Flask用法详解

    Flask是一个用Python编写的轻量级Web应用框架,由于其“微”性质,Flask在提供核心服务的同时,仍然提供了许多扩展的可能性,在这篇文章中,我们将从最基础开始,学习如何使用Flask构建一个Web应用,需要的朋友可以参考下
    2023-08-08
  • Python读取ini文件、操作mysql、发送邮件实例

    Python读取ini文件、操作mysql、发送邮件实例

    这篇文章主要介绍了Python读取ini文件、操作mysql、发送邮件实例,本文重点在Mysql操作的讲解上,包含查询、插入、更新和删除操作,需要的朋友可以参考下
    2015-01-01
  • 详解pandas中iloc, loc和ix的区别和联系

    详解pandas中iloc, loc和ix的区别和联系

    这篇文章主要介绍了详解pandas中iloc, loc和ix的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • python实现学生信息管理系统(面向对象)

    python实现学生信息管理系统(面向对象)

    这篇文章主要介绍了python实现面向对象版学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 在Python中使用PIL模块对图片进行高斯模糊处理的教程

    在Python中使用PIL模块对图片进行高斯模糊处理的教程

    这篇文章主要介绍了在Python中使用PIL模块对图片进行高斯模糊处理的教程,这个无图形界面的脚本代码非常简单,需要的朋友可以参考下
    2015-05-05
  • Python机器学习库scikit-learn使用详解

    Python机器学习库scikit-learn使用详解

    scikit-learn是Python中最流行的机器学习库之一,它提供了各种各样的机器学习算法和工具,包括分类、回归、聚类、降维等
    2023-03-03
  • Python如何快速生成本项目的requeirments.txt实现

    Python如何快速生成本项目的requeirments.txt实现

    本文主要介绍了Python如何快速生成本项目的requeirments.txt实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 使用python Django做网页

    使用python Django做网页

    python Django网页的四个步骤,很简单的图文学习。学习python Django做网页的第一步。
    2013-11-11

最新评论