首页 > 系统相关 >python利用subprocess执行shell命令

python利用subprocess执行shell命令

时间:2023-01-16 00:11:15浏览次数:44  
标签:shell stdout python cmd subprocess PIPE 进程

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文件进行爆破

标签:shell,stdout,python,cmd,subprocess,PIPE,进程
From: https://www.cnblogs.com/-Lucky-/p/17054512.html

相关文章

  • Python django 公寓管理系统
    Pythondjango公寓管理系统django公寓租房系统django酒店订购系统django公寓订购系统技术:Pythondjango数据库:MySQL前端:htmlcssjs涉及到的功能:登录、注册、......
  • Python django 会议室管理系统
    Pythondjango会议室管理系统django会议室申请系统django会议室系统技术:Pythondjango数据库:MySQL涉及功能:登录、注册、登出、管理员登录、管理用户信息等添加会......
  • Python django 图书馆管理系统
    Pythondjango图书馆管理系统技术:Python  django数据库:sqlite3(或MySQL)前段:html css  js 功能:注册,注销,改密码,添加图书,添加图书照片,查看图书,普通用户只能查看......
  • python之pyserial模块
    pyserial模块封装了对串口的访问,兼容各种平台(Windows、Linux、MACOS等)。其支持的特性如下:所有平台基于类的接口相同端口可以通过python来设置支持不同数据长度、停止......
  • python创建6个随机数
    代码块red_balls=[xforxinrange(1,34)]selected_balls=sample(red_balls,6)selected_balls.sort()selected_balls.append(randint(1,16))......
  • 一些shell小脚本
    1.两数相加1#!/bin/bash23sum=$(($1+$2))4echo$sum  第3行解析:从$1开始才是输入参数,$0是文件名(包含其路径)  2.$#,$*,$@的区别$#:代表所有参数的......
  • python读取pcap流量
    fromscapy.allimport*packet0=rdpcap('G:/testcic/input/ubuntu_chrome_discord_7.pcap')importos#读取dir_path目录下的文件dir_path=r'G:/testcic/input/'fil......
  • Python爬虫-第四章-1-多线程多进程并发爬取Ⅰ
    多线程多进程用的方式#DemoDescribe:多线程写法fromthreadingimportThread#线程frommultiprocessingimportProcess#进程#start--------1,多线程调用的方式一......
  • Python爬虫-第四章-1-多线程多进程并发爬取Ⅱ
    线程池使用案例:一次性开辟一些线程,用户直接给线程池提交任务,线程任务的调度交给线程池#DemoDescribe:线程池和进程池fromconcurrent.futuresimportThreadPoolExecutor,......
  • Python爬虫-第四章-1-多线程多进程并发爬取Ⅲ-爬取某菜市场批发价数据
    #DemoDescribe:爬取北京新发菜地数据importrequestsimportcsvfromconcurrent.futuresimportThreadPoolExecutorfromfake_useragentimportUserAgent'''本章内容:......