返回顶部
首页 > 资讯 > 后端开发 > Python >详谈python中subprocess shell=False与shell=True的区别
  • 640
分享到

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

2024-04-02 19:04:59 640人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只

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。

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

--结束END--

本文标题: 详谈python中subprocess shell=False与shell=True的区别

本文链接: https://lsjlt.com/news/124335.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详谈python中subprocess shell=False与shell=True的区别
    shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,当shell=False是,subprocess.call只...
    99+
    2024-04-02
  • 解决python subprocess参数shell=True踩到的坑
    0x01 问题现象 写的程序使用subprocess创建子进程运行其他程序,判断其他程序运行完后进行处理。 在subprocess使用了shell=True,判断用户程序退...
    99+
    2024-04-02
  • bash shell和dash shell的区别详解
    最近在工作中遇到一个很奇葩的问题,就是一个嵌入式的SDK编译,它里面执行shell命令的时候,使用的dash shell来解析,而通常我们默认用的是bash shell来解析;我按照bash shell那样照常编写脚本,...
    99+
    2023-05-06
    bash shell dash shell
  • C语言中的return true和return false有什么区别
    在C语言中,return true和return false是用于表示一个函数的返回值是真(true)或假(false)。它们的区别...
    99+
    2023-08-19
    C语言
  • $*与$@中Shell中有什么区别
    这篇文章给大家介绍$*与$@中Shell中有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据...
    99+
    2023-06-06
  • Shell编程中while与for的区别及用法详解
    在shell编程中经常用到循环,常用的循环有for和while循环两种。while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别。 一、常用语法 ...
    99+
    2022-06-04
    详解 区别 Shell
  • linux shell中“.” 和 “./”执行的区别详解
    目前注意到的区别主要在于环境变量的作用域上: 1. 如果使用" ./ " 执行,可以理解为程序运行在一个全新的shell中,不继承当前shell的环境变量的值, 同时若在程序中改变了当前shell中的环境变量(不使用ex...
    99+
    2022-06-04
    shell “.” “./”
  • 详谈OnTouchListener与OnGestureListener的区别
    Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,是通过OnTouchListener实现的;而手势是通过OnGestureListener实现的,那么这两者有什么关联呢?OnTouchListenerOnTou...
    99+
    2023-05-31
    ontouchlistener ongesturelistener 详谈
  • 详谈Lock与synchronized 的区别
    1、lock是可中断锁,而synchronized 不是可中断锁线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断如果 使用Reen...
    99+
    2023-05-31
    synchronized lock 详谈
  • 详解Shell $*和$@之间的区别
    $* 和 $@ 都表示传递给函数或脚本的所有参数,我们已在《Shell特殊变量》一节中进行了演示,本节重点说一下它们之间的区别。 当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看...
    99+
    2022-06-04
    Shell $* $@
  • Shell编程中while与for的区别有哪些
    这篇文章给大家分享的是有关Shell编程中while与for的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常用语法1、for循环for循环常用的语法结构有如下几种:for 变量 in seq字符串...
    99+
    2023-06-09
  • Python中判断subprocess调起的shell命令是否结束
    前言 最近在使用subprocess遇到个问题,折腾了好半天才找到简单的解决办法,在这里记录下。 环境 Python:2.7.10 库:subprocess, logging 问题 ...
    99+
    2024-04-02
  • shell中xargs、-exec与管道间的区别是什么
    本文小编为大家详细介绍“shell中xargs、-exec与管道间的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“shell中xargs、-exec与管道间的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-27
  • 简单谈谈Android中SP与DP的区别
    从一开始写Android程序,就被告知这些常识 一、dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位。在每英寸160点的显示器...
    99+
    2022-06-06
    dp Android
  • 浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解
    首先从字面意思理解两个词 onTouchEvent:触发触摸事件 onInterceptTouchEvent:触发拦截触摸事件 通过查看源代码及类继承关系 onIntercep...
    99+
    2022-06-06
    Android
  • 详谈Array和ArrayList的区别与联系
    昨天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和ArrayList的区别和联系之后,却让博主一脸懵...
    99+
    2023-05-31
    array arraylist 区别
  • Shell中exit和return的区别讲解
    1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程。使用格式如下: exit [<n>] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异...
    99+
    2022-06-04
    shell中exit和return shell中exit和return的区别讲解
  • 浅谈C++中const与constexpr的区别
    目录一.const常量与#define比较二.const修饰1.修饰普通变量,必须初始化2.修饰类变量和成员变量3.修饰成员函数4.修饰指针5.修饰引用三.const转换四.顶层co...
    99+
    2024-04-02
  • Shell中exit和return的区别有哪些
    这篇文章主要介绍了Shell中exit和return的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.exit命令exit命令是Shell内建命令,用于退出当前S...
    99+
    2023-06-09
  • 详解Python中range()与xrange()的区别
    目录前言返回类型记忆操作使用Speed前言 range() 和 xrange() 是两个函数,可用于在 Python的 for 循环中迭代一定次数。在 Python 3 中,没有 x...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作