subprocess以及常用的封装函数

运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。

subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。

subprocess 模块可以启动一个新进程,并连接到它们的输入/输出/错误管道,获取进程执行的结果。Popen 是 subprocess的核心, 负责子进程的创建和管理, run() 方法可以便捷的获取进程的返回结果。

subprocess.Popen()

# 常用参数(入参)
# args
shell 命令:可以是字符串或者序列类型(list or tuple)
# bufsize
缓冲区大小:创建标准流的管道对象时使用, 默认值:-1
0 : 不使用缓冲区
1 : 表示行缓冲,仅当 universal_newlines=True时可用(也就是文本模式时)
正数 : 表示缓冲区的大小
负数 : 表示使用默认的缓冲区大小
# stdin, stdout, stderr
分别表示程序的标准输入、输出、错误句柄
# preexec_fn
只有在Unix平台下有效,用于指定一个可执行对象,它将在子进程运行之前被调用
# shell
如果该参数为True, 将通过操作系统的shell执行指定命令
# cwd
用于设置子进程的当前目录
# env
用于指定子进程的环境变量
如果 env=None, 则子进程的环境变量将从父进程中继承
# encoding
设置编码类型
cn:
mac : utf-8
windows : gb2312 # Popen 对象的方法/属性
## poll():
检查进程是否终止,如果终止返回returncode,否则返回None
## wait(timeout):
等待子进程终止,可以指定超时时间
## communicate(input, timeout):
与子进程交互,发动和读取数据
## send_signal():
发送信号到子进程
## terminate():
停止子进程,即是发送SIGTERM信号到子进程
## kill():
杀掉子进程,即是发送SIGKILL信号到子进程 # Popen 返回对象
返回对象一般都是二进制的标准输入、输出和错误句柄

subprocess.run()

# 常用参数(入参)
# args
shell 命令:可以是字符串或者序列类型(list or tuple)
# stdin, stdout, stderr
分别表示程序的标准输入、输出、错误句柄, 默认值均是None
若要与程序交互,则需要设置stdin
若需获取输出和错误,则需要设置stdout, stderr
一般设置为subprocess.PIPE代表打开通向标准流的管道,创建一个新的管道
文件对象设置为subprocess.DEVNULL
stderr也可以设置为subprocess.STDOUT
表示将子程序的标准错误输出重定向到了标准输出
# shell
默认值为False
若为True:
args参数可以是复杂字符串,同人为在linux中输入命令一样
若为False:
args命令中包含参数,则必须以命令列表的方式传入
一般可以通过shlex.split(string)处理即可
# universal_lines
若为True:
stdin,stdout,stderr均已字符串方式读写,
若为False:
stdin,stdout,stderr以字节流方式读写
# cwd
用于设置子进程的当前目录(执行路径)
运行非shell命令时,可以用来指定程序的所在路径
# timeout
命令超时时间,当程序超过指定时间没有返回时,则会抛出异常

subprocess.call()

父进程等待子进程完成,并且返回子进程执行的结果 0/1 其实现方式

返回退出信息(returncode,相当于Linux exit code)

subprocess.check_call()

父进程等待子进程完成

返回0

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查

subprocess.check_output()

执行args命令,返回值为命令执行的输出结果;

若执行成功,则函数返回值为命令输出结果;若执行失败,则抛出异常;

(类似subprocess.run(args, check=True, stdout=subprocess.PIPE).stdout)

测试

import subprocess

def popen(cmd):
ret = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="gb2312")
if not ret.returncode:
print(ret.stdout.read()) def run(cmd):
ret = subprocess.run(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True, encoding="gb2312")
if not ret.returncode:
print(ret.stdout.strip()) def call(cmd):
ret = subprocess.call(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
if ret == 0:
print("执行成功!!") def checkcall(cmd):
ret = subprocess.check_output(cmd, shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, encoding="gb2312")
print(ret.strip()) cmd = "python --version"
checkcall(cmd)
call(cmd)
popen(cmd)
run(cmd)

结果

Python 3.10.7
执行成功!!
Python 3.10.7 Python 3.10.7

也可以使用对ctf中一些exe文件进行爆破

python利用subprocess执行shell命令的更多相关文章

  1. python利用subprocess执行交互命令

    已经知道,os.system可以方便的利用python代码执行一些像ping.ipconfig之类的系统命令,但却只能得到命令执行是否成功,不能获得命令成功执行后的结果,像下面这样: >> ...

  2. python通过接口执行shell命令

    需求:通过网站url方式直接执行服务器的shell命令 实现: 1.安装依赖 pip3 install falsk 2.python脚本 [root@localhost tmp]# more fals ...

  3. python 利用subprocess调用cmd命令程序,并正确输出控制台的输出中文

    平台Python3.7 1.利用控制台运行程序后在控制台会输出中文提示,但是用python调用subprocess.run函数后返回的输出是乱码,于是,解决方法是用subprocess.check_o ...

  4. Python ssh 远程执行shell命令

    工具 python paramiko 远程执行命令 import paramiko ssh = paramiko.SSHClient() key = paramiko.AutoAddPolicy() ...

  5. python中command执行shell命令脚本方法

    在Python中有一个模块commands也很容易做到以上的效果.看一下三个函数:1). commands.getstatusoutput(cmd)用os.popen()执行命令cmd, 然后返回两个 ...

  6. python利用paramiko执行服务器命令

    话不多说直接上代码 封装连接 @staticmethod def connect(ip, server_user, server_port, server_path): ""&qu ...

  7. python之commands和subprocess入门介绍(可执行shell命令的模块)

    一.commands模块 1.介绍 当我们使用Python进行编码的时候,但是又想运行一些shell命令,去创建文件夹.移动文件等等操作时,我们可以使用一些Python库去执行shell命令. com ...

  8. python的subprocess模块执行shell命令

    subprocess模块可以允许我们执行shell命令 一般来说,使用run()方法就可以满足大部分情况 使用run执行shell命令 In [5]: subprocess.run('echo &qu ...

  9. python中执行shell命令行read结果

    +++++++++++++++++++++++++++++ python执行shell命令1 os.system 可以返回运行shell命令状态,同时会在终端输出运行结果 例如 ipython中运行如 ...

  10. subprocess模块还提供了很多方便的方法来使得执行 shell 命令

    现在你可以看到它正常地处理了转义. 注意 实际上你也可以在shell=False那里直接使用一个单独的字符串作为参数, 但是它必须是命令程序本身,这种做法和在一个列表中定义一个args没什么区别.而如 ...

随机推荐

  1. 基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)

    摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注.记录和保存缺陷位置和类型,以辅助电路板的质检.本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出P ...

  2. Java面试——Redis

    一.Redis 为什么那么快 [1]完全基于内存,绝大部分请求是纯粹的内存操作,非常快速.数据存在内存中.[2]数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的.[3]采用单线程 ...

  3. java多线程基础小白指南--线程的状态

    线程的状态比较混乱,网上的资料也是五花八门,这时候就要参考 注意截图中的最后一句话,很多人把jvm中线程状态与实际上的os线程状态搞混了,所以才会有很多乱七八糟的状态出现. 注意Runnable其实含 ...

  4. 购物车,实现增删改查;无bug,还有一个直接修改购物车数量功能未实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Windows 下无法使用 C++11 标准 thread 类

    问题描述 最近需要在 windows 平台使用 C++ 多线程编程,编译时提示错误 thread is not a member of std, or you maybe forget '#inclu ...

  6. Laravel 代码开发最佳实践(持续更新)

    我们这里要讨论的并不是 Laravel 版的 SOLID 原则(想要了解更多 SOLID 原则细节查看这篇文章)亦或是设计模式,而是 Laravel 实际开发中容易被忽略的最佳实践. 内容概览 单一职 ...

  7. 让SQL起飞(优化)

    最近博主看完了<SQL进阶教程>这本书,看完后给博主打开了SQL世界的新大门,对于 SQL 的理解不在局限于以前的常规用法.借用其他读者的评论, ❝ 读完醍醐灌顶,对SQL做到了知其然更能 ...

  8. Redis分布式锁这样用,有坑?

    背景 在微服务项目中,大家都会去使用到分布式锁,一般也是使用Redis去实现,使用RedisTemplate.Redisson.RedisLockRegistry都行,公司的项目中,使用的是Redis ...

  9. ROS2的安装与使用(超详细图文教程)

    ROS2的安装与使用(超详细图文教程) 如果前面的虚拟机以及Ubuntu22.04镜像都安装好了,根据目录直接跳到ROS2的安装. 资料参考于:古月居 VMware虚拟机的安装 安装地址: 对于不了解 ...

  10. Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践) 相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建 ...