Python subprocess + timeout的命令执行

Popen对象

  • poll() 判断是否执行完毕,执行完毕返回0,未执行完毕返回None
  • terminate() 终止进程发送SIGTERM信号
  • raise 自定义返回错误
import time
import subprocess  

class TimeoutError(Exception):
    pass  

def command(cmd, timeout=60):
    """执行命令cmd,返回命令输出的内容。
    如果超时将会抛出TimeoutError异常。
    cmd - 要执行的命令
    timeout - 最长等待时间,单位:秒
    """
    p = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True)
    t_beginning = time.time()
    seconds_passed = 0
    while True:
        if p.poll() is not None:
            break
        seconds_passed = time.time() - t_beginning
        if timeout and seconds_passed > timeout:
            p.terminate()
            raise TimeoutError(cmd, timeout)
        time.sleep(0.1)
    return p.stdout.read()  

if __name__ == "__main__":
    print command(cmd=‘ping www.redicecn.com‘, timeout=1)

  

时间: 2024-10-13 21:28:12

Python subprocess + timeout的命令执行的相关文章

Python开发的3种命令执行方法

在python开发中,我们常常需要执行命令,修改相关信息.那对于初学者来说,python中如何执行命令呢?今天,小编就为大家分享3种python命令执行的方法. 1. 使用os.system("cmd") 在python中,使用os.system("cmd")的最大特点是,其执行时程序会打出cmd在linux上执行的信息. import os os.system("ls") 2. 使用Popen模块产生新的process Popen是现在pyth

python之实现批量远程执行命令(堡垒机)

python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对python的django还没有了解,并且对于HTML和JS这类开发学习还没有涉及,所以我说我做些后台的实现,前端就交给我的同学做.不扯淡了,下面说下我做批量执行的思路. 用到的模块:paramiko 功能:很简单就是批量执行命令,类似于ansible,本来想用Fabric,但是想一想还是用paramiko,

socket实现在python中调用操作系统的命令(subprocess)

在python中调用操作系统的命令 import os import subprocess # r = os.popen('ipconfig') r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE). # subprocess.Popen(cmd,shell=True,subprocess.stdout,subprocess.stderr) # cmd : 代表系统命令 # shel

Centos sudo命令执行python与普通用户执行python版本不同

前段时间新安CentOS 6.5虚拟机,顺便将自带的Python2.6升级到Python 2.7和安装pip.http://blog.csdn.net/jcjc918/article/details/11022345 然而发现随后通过pip安装的包,在python里使用import命令提示找不到module,排查后发现pip安装在了python 2.6的文件夹下. 由于sudo命令下python的寻址结果依然为python 2.6,因此在pip安装文件夹下,通过sudo命令sudo python

Python中直接在MySQL执行SQL命令

因为懒,所以不想用SQLyog,用Python写了一个快速执行SQL命令的程序: import pymysql,sys class dealMySQL(object):     'PyMysql'     version = 'Version:0.1'      author = 'Author: August'          def __init__(self):         pass          @classmethod         def execute(self,sql

转:Python安全 - 从SSRF到命令执行惨案

转:https://www.leavesongs.com/PENETRATION/getshell-via-ssrf-and-redis.html Python安全 - 从SSRF到命令执行惨案 PHITHON 前两天遇到的一个问题,起源是在某个数据包里看到url=这个关键字,当时第一想到会不会有SSRF漏洞. 以前乌云上有很多从SSRF打到内网并执行命令的案例,比如有通过SSRF+S2-016漏洞漫游内网的案例,十分经典.不过当时拿到这个目标,我只是想确认一下他是不是SSRF漏洞,没想到后面找

python 代码审计-命令执行漏洞(自己编写的代码)

python 代码审计-命令执行漏洞(自己编写的代码) 0x00 源代码 def execute(request): context ={} ip= request.POST.get("ip") username= request.POST.get("username") password= request.POST.get("password") idnex= int(request.POST.get("index")) c

python subprocess模块

转 http://blog.csdn.net/imzoer/article/details/8678029 subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=

python subprocess

def getResult(cmd, timeout=2): #命令超时时间 deadline = time.time() + timeout r = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) while time.time() < deadline and r.poll() is None: time.sleep(0.1) if r.poll() is None: #检查子进程 r.kill() r.wait() ret