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。

时间: 2024-09-10 06:53:49

python subprocess模块的shell参数问题的相关文章

Python subprocess模块学习总结_python

一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序.subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用.另外subprocess还提供了一些管理标准流(standard stream)和管

python中模块optparse获取参数详解

python作为我们干运维的重要的语言,肯定我们大家都写了不少,我们写东西不是为了给我们自己用,而是我们团队或者更多人用. 那么就不得不说下python下获取参数的方法啦.python自带的模块optparse就是我们一直喜欢和常用的啦(当然也有getopt,但是没这个好用).废话不说了,下面说说怎么用吧!! 首先贴一下官方文档地址:http://docs.python.org/2/library/optparse.html 讲之前先引用下默认字体自带的例子: from optparse imp

Python subprocess子进程(程序调用)模块

前言 subpocess用于在父进程中创建子进程,如果你希望在Python程序中调用外部程序,如:Powershell.shell.cmd.bat.subprocess将会是一个非常好的选择. 软件环境 系统  Win 10 软件  Python 3.4.4 IPython 4.0.0 认识subprocess 还是那句话,最高效的方法不过看官方文档,传送门:这里 subprocess:The subprocess module allows you to spawn new processes

Python的subprocess模块总结_python

subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.* subprocess最简单的用法就是调用shell命令了,另外也可以调用程序,并且可以通过stdout,stdin和stderr进行交互. subprocess的主类 复制代码 代码如下: subprocess.Popen(       args,       bufsize=0,       executable=None,      

Python下的subprocess模块的入门指引_python

在熟悉了Qt的QProcess以后,再回头来看python的subprocess总算不觉得像以前那么恐怖了. 和QProcess一样,subprocess的目标是启动一个新的进程并与之进行通讯.subprocess.Popen 这个模块主要就提供一个类Popen: class subprocess.Popen( args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, clos

【Python】模块之subprocess

一 简介    在使用Python 开发MySQL自动化相关的运维工具的时候,遇到一些有意思的问题,本文介绍Python的 subprocess 模块以及如何和MySQL交互具体操作,如启动 ,关闭 ,备份数据库.二 基础知识 Python2.4引入subprocess模块来管理子进程,可以像Linux 系统中执行shell命令那样fork一个子进程执行外部的命令,并且可以连接子进程的output/input/error管道,获取命令执行的输出,错误信息,和执行成功与否的结果. Subproce

Python中subprocess模块用法实例详解

  本文实例讲述了Python中subprocess模块用法.分享给大家供大家参考.具体如下: 执行命令: ? 1 2 3 4 >>> subprocess.call(["ls", "-l"]) 0 >>> subprocess.call("exit 1", shell=True) 1 测试调用系统中cmd命令,显示命令执行的结果: ? 1 2 3 x=subprocess.check_output([&quo

python-Python中subprocess模块怎样运行外一个shell命令的前提下再运行另外一个,谢谢

问题描述 Python中subprocess模块怎样运行外一个shell命令的前提下再运行另外一个,谢谢 比如说先运行切换用户权限,然后再进行操作比如以下编码是不行的 child1=subprocess.Popen('su test'shell=True)child1=subprocess.Popen('mkdir test'shell=True)这样子还是会在当前用户进行mkdir,那怎样做才能在test用户下进行创建?谢谢!! 解决方案 把几个命令放到一个bash脚本 然后popen直接执行

python subprocess使用

shell中可以很方便的调用其它应用程序,将不同的应用程序组合组合起来. python通过subprocess模块也能实现类似功能. 因为python拥有丰富的数据接口,简洁的语法,让python在进行类似的工作时比shell更容易维护. subprocess模块是在python2.4的时候引入.详细信息查看PEP 324 介绍 subprocess主要有以下几个函数: call(args, *, stdin=None, stdout=None, stderr=None, shell=False