subprocess笔记

subprocess笔记


'''
https://www.runoob.com/w3cnote/python3-subprocess.html

常用参数:

    args:shell命令,可以是字符串或者序列类型(如:list,元组)
    bufsize:缓冲区大小。当创建标准流的管道对象时使用,默认-1。
    0:不使用缓冲区
    1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
    正数:表示缓冲区大小
    负数:表示使用系统默认的缓冲区大小。
    stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
    cwd:用于设置子进程的当前目录。
    env:用于指定子进程的环境变量。如果 env = None,子进程的环境变量将从父进程中继承。
    
    
Popen 对象方法

    poll(): 检查进程是否终止,如果终止返回 returncode,否则返回 None。
    wait(timeout): 等待子进程终止。
    communicate(input,timeout): 和子进程交互,发送和读取数据。
    send_signal(singnal): 发送信号到子进程 。
    terminate(): 停止子进程,也就是发送SIGTERM信号到子进程。
    kill(): 杀死子进程。发送 SIGKILL 信号到子进程。 
'''
import time
import subprocess

def cmd(command):
    subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")
    subp.wait(2)
    if subp.poll() == 0:
        print(subp.communicate()[1])
    else:
        print("失败")



cmd("java -version")
cmd("exit 1")
import os,re
import subprocess

ip = input("[*] ip:")
child = subprocess.Popen("masscan {} -p1-65535 --rate 2000".format(ip),stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True)

list = []
while child.poll() is None:
    output = child.stdout.readline().decode("gbk", "ignore")
    print(child.pid, output.strip())

    if "found" in output.strip():
        foundNumber = re.findall(r'found=(\d{1,5})', output.strip())
        list.append(foundNumber)

    if len(list) > 10:
        print("[*] find port = ", list)
        os.kill(child.pid, 9)
        # os.popen("taskkill /f /pid {}".format(child.pid))

import os
import signal
import subprocess
import platform

def run_cmd(cmd_string, timeout=600):
    """
    执行命令
    :param cmd_string:  string 字符串
    :param timeout:  int 超时设置
    :return:
    """
    p = subprocess.Popen(cmd_string, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True, close_fds=True,
                         start_new_session=True)
 
    format = 'utf-8'
    if platform.system() == "Windows":
        format = 'gbk'
 
    try:
        (msg, errs) = p.communicate(timeout=timeout)
        ret_code = p.poll()
        if ret_code:
            code = 1
            msg = "[Error]Called Error : " + str(msg.decode(format))
        else:
            code = 0
            msg = str(msg.decode(format))
    except subprocess.TimeoutExpired:
        # 注意:不能使用p.kill和p.terminate,无法杀干净所有的子进程,需要使用os.killpg
        p.kill()
        p.terminate()
        os.killpg(p.pid, signal.SIGUSR1)
 
        # 注意:如果开启下面这两行的话,会等到执行完成才报超时错误,但是可以输出执行结果
        # (outs, errs) = p.communicate()
        # print(outs.decode('utf-8'))
 
        code = 1
        msg = "[ERROR]Timeout Error : Command '" + cmd_string + "' timed out after " + str(timeout) + " seconds"
    except Exception as e:
        code = 1
        msg = "[ERROR]Unknown Error : " + str(e)
 
    return code, msg
posted @   是谁走漏了消息  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示