精华内容
下载资源
问答
  • 那么我们在python3中使用os.popen()出错该怎么办?本篇文章小编同样以错误的操作方法为大家进行讲解,一起找寻不对的地方吧。 在当前 desktop 目录下,有如下内容: desktop $ls client.py server.py 中文测试 ...
  • 最近在使用 python 执行启动 appium 服务器命令时,发现 os.system()、os.popen() 均不能完美的启动服务,最后查了好多资料,使用 subprocess.run() 方法解决了问题,下面将对这三种方法一一对比: os.system() 原理...

    概述

    最近在使用 python 执行启动 appium 服务器命令时,发现 os.system()、os.popen() 均不能完美的启动服务,最后查了好多资料,使用 subprocess.run() 方法解决了问题,下面将对这三种方法一一对比:

    os.system()

    原理

    os.system方法是os模块最基础的方法,其它的方法一般在该方法基础上封装完成。

    详解

    os.system()的返回值是脚本的退出状态码,0表示成功,其他均为失败:

    >>> a=os.system('adb devices')
    >>> a
    0
    

    补充

    system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。

    但是上述原理会导致当需要执行多条命令行的时候可能得不到预期的结果:

    import os
    
    os.system('cd /usr/local')
    os.mkdir('aaa.txt)
    

    上述程序运行后会发现txt文件并没有创建在/usr/local文件夹下,而是在当前的目录下。

    因此为了保证system执行多条命令可以成功,多条命令需要在同一个子进程中运行:

    import os
    
    os.system('cd /usr/local && mkdir aaa.txt')
    # 或者
    os.system('cd /usr/local ; mkdir aaa.txt')
    

    os.popen()

    原理

    os.popen() 方法用于从一个命令打开一个管道,在Unix,Windows中有效。

    语法
    popen()方法语法格式如下:

    os.popen(command[, mode[, bufsize]])
    

    参数
    command – 使用的命令。
    mode – 模式权限可以是 ‘r’(默认) 或 ‘w’。
    bufsize – 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。

    返回值
    返回一个文件描述符号为fd的打开的文件对象。

    实例
    以下实例演示了 popen() 方法的使用:

    #!/usr/bin/python3
    import os, sys
    
    # 使用 mkdir 命令
    a = 'mkdir nwdir'
    b = os.popen(a,'r',1)
    print (b)
    

    执行以上程序输出结果为:

    open file 'mkdir nwdir', mode 'r' at 0x81614d0
    

    python调用Shell脚本,有两种方法:os.system()和os.popen(),
    前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容

    假定有一个shell脚本test.sh:

    song@ubuntu:~$ vi test.sh
    #!/bin/bash
    echo 'hello python!'
    echo 'hello world!'
    exit 1
    

    os.system(command):该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0x0100,换算为十进制得到256。

    要获得os.system的正确返回值,可以使用位移运算(将返回值右移8位)还原返回值:

    >>> import os
    >>> os.system("./test.sh")
    hello python!
    hello world!
    256
    >>> n=os.system("./test.sh")
    hello python!
    hello world!
    >>> n
    256
    >>> n>>8
    1
    

    os.popen(command):这种调用方式是通过管道的方式来实现,函数返回一个file对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容),使用os.popen调用test.sh的情况:

    >> import os
    >>> os.popen("./test.sh")
    <open file './test.sh', mode 'r' at 0x7f6cbbbee4b0>
    >>> f=os.popen("./test.sh")
    >>> f
    <open file './test.sh', mode 'r' at 0x7f6cbbbee540>
    >>> f.readlines()
    ['hello python!\n', 'hello world!\n']
    

    像调用”ls”这样的shell命令,应该使用popen的方法来获得内容,对比如下:

    >>> import os
    >>> os.system("ls")   #直接看到运行结果
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    0    #返回值为0,表示命令执行成功
    >>> n=os.system('ls')
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    >>> n
    0
    >>> n>>8   #将返回值右移8位,得到正确的返回值
    0
    >>> f=os.popen('ls') #返回一个file对象,可以对这个文件对象进行相关的操作
    >>> f
    <open file 'ls', mode 'r' at 0x7f5303d124b0>
    >>> f.readlines()
    ['Desktop\n', 'Documents\n', 'Downloads\n', 'examples.desktop\n', 'Music\n', 'Pictures\n', 'Public\n', 'systemExit.py\n', 'Templates\n', 'test.sh\n', 'Videos\n']
    

    os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。

    补充
    1.返回值是文件对象
    注意:返回值是文件对象,既然是文件对象,使用完就应该关闭,对吧?!不信网上搜一下,一大把文章提到这个os.popen都是忘记关闭文件对象的。所以,推荐的写法是:

    with os.popen(command, "r") as p:
        r = p.read()
    

    至于with的用法就不多讲了,使用它,不需要显式的写p.close()。

    2.非阻塞
    通俗的讲,非阻塞就是os.popen不会等cmd命令执行完毕就继续下面的代码了,不信?!看下面代码实例:

    import os
    
    os.popen(r"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe")
    print("测试开发小白便怪兽")
    

    从上面实例可知,os.popen执行打开QQScLauncher.exe这个工具,但从实际执行结果看,QQScLauncher.exe还没打开,就直接进入了下一条语句,打印了“测试开发小白变怪兽”。在某些应用场景,可能这并不是你期望的行为,那如何让命令执行完后,再执行下一句呢?

    处理方法是使用read()或readlines()对命令的执行结果进行读操作。

    3.完全阻塞
    上面写了该函数是非阻塞的,现在怎么又变成完全阻塞的呢?感觉一头雾水了吧。本质上os.popen是非阻塞的,为了实现阻塞的效果,我们使用read()或readlines()对命令结果进行读,由此产生了阻塞的效果。但是,如果你的命令执行无法退出或进入交互模式,这种“读”将形成完全阻塞的情况,表现的像程序卡住了。

    看下面代码实例:

    import os
    ret = os.popen("ping 127.0.0.1 -t")
    ret.readlines()
    

    os.popen执行了ping 127.0.0.1 -t 该命令会一直执行,除非CTRL+C强制退出,因而,执行readlines读取命令输出时会造成卡住。

    总结
    os.popen()在大多数场景都是挺好用方便的,但是也有坑!!具体应用中,需要注意下:
    1. 在需要读取命令执行结果时,避免在命令无法退出或进入交互模式的场景应用os.popen;
    2.os.popen()无法满足需求时,可以考虑subprocess.Popen();

    未完待续…

    这篇文章主要讲了 os.system() 和 os.popen() 的细节及区别,下篇文章继续说明 subprocess 模块的用法,敬请期待!

    展开全文
  • 个人笔记,大佬勿喷 关于介绍,网上一堆,可自行百度 这里记录一下popen()接受命令返回值及处理,我想要的值是docker的ID $ docker ps -q 2d3586a30e7e 03f1ca1331c7 ...In [9]: a = os.popen('docker ps -q')
  • os.popen OS命令注入漏洞os.popen基础python os.popen OS命令注入漏洞 一、python OS命令注入漏洞 1. 警惕subprocess.getstatusoutput OS命令注入漏洞 python直接执行代码漏洞_警惕OS命令注入漏洞 - python篇 参考...

    一、python OS命令注入漏洞

    1. 警惕subprocess.getstatusoutput OS命令注入漏洞

    python直接执行代码漏洞_警惕OS命令注入漏洞 - python篇
    参考URL: https://blog.csdn.net/weixin_39805851/article/details/111079766

    背景:
    在后台开发过程中,经常会遇到需要执行一些shell命令,但是命令的参数需要通过Restful API传入,举个简单的例子:

    后台实现了一个ping的功能,用户可以指定ping的目标,假设后台代码:def ping(target):

    return subprocess.getstatusoutput(‘ping -c 1 %s’ % target)

    如果用户正确传target值,那么没啥问题,比如用户想ping下百度,最终调用是:ping(“www.baidu.com”)

    执行的shell命令是:ping -c 1 www.baidu.com

    但是如果有一个用户,恶意的传了这么一个target: baidu.com; rm -rf /,后台直接填充到ping命令中去,那么后台执行的命令就是:ping -c 1 baidu.com; rm -rf /

    如果你是以root用户执行的话,那就只能赶紧跑路了。

    如何防御

    防御的办法有这么几个思路:对传入的值做安全检查,比如必须符合IP或域名的格式,尤其要警惕那些命令连接符号,比如:|,&&,$(),;等

    尽量不要用root用户执行,对程序的权限做合理的控制。

    使用带有安全机制的函数库,在上面那个例子中,subprocess.getstatusoutput底层是调用的subprocess.check_output并且参数中设置了shell=True:def getstatusoutput(cmd):

    try:
    
    data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
    
    exitcode = 0
    
    except CalledProcessError as ex:
    
    data = ex.output
    
    exitcode = ex.returncode
    
    if data[-1:] == '\n':
    
    data = data[:-1]
    
    return exitcode, data
    

    问题就出在shell=True上,设置为True就是直接把命令丢给shell处理的,就会出现上述问题。如果设置成False,再把subprocess接收的Command参数改成一个List,例如:[“ls”, “-l”],在运行时,subprocess会把Command参数List的第一个元素作为执行命令,后面的项都强制作为参数去处理,也就没有注入的风险了。

    2. os.popen OS命令注入漏洞

    os.popen基础

    python调用Shell脚本,有两种方法:os.system()和os.popen(),

    前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容

    os.popen() 方法用于从一个命令打开一个管道。
    在Unix,Windows中有效。

    os.popen(command):这种调用方式是通过管道的方式来实现,函数返回一个file对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)

    举例:像调用”ls”这样的shell命令,应该使用popen的方法来获得内容,对比如下:

    >>> import os
    >>> os.system("ls")   #直接看到运行结果
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    0    #返回值为0,表示命令执行成功
    >>> n=os.system('ls')
    Desktop    Downloads     Music     Public     Templates  Videos
    Documents  examples.desktop  Pictures  systemExit.py  test.sh
    >>> n
    0
    >>> n>>8   #将返回值右移8位,得到正确的返回值
    0
    >>> f=os.popen('ls') #返回一个file对象,可以对这个文件对象进行相关的操作
    >>> f
    <open file 'ls', mode 'r' at 0x7f5303d124b0>
    >>> f.readlines()
    ['Desktop\n', 'Documents\n', 'Downloads\n', 'examples.desktop\n', 'Music\n', 'Pictures\n', 'Public\n', 'systemExit.py\n', 'Templates\n', 'test.sh\n', 'Videos\n']
    >>> 
    

    os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被使用。因为它返回一个文件对象,可以对这个文件对象进行相关的操作。

    1. 返回值是文件对象

    注意:返回值是文件对象,既然是文件对象,使用完就应该关闭,对吧?!不信网上搜一下,一大把文章提到这个os.popen都是忘记关闭文件对象的。 所以,推荐的写法是:

    with os.popen(command, "r") as p:
        r = p.read()
    

    至于with的用法就不多讲了,使用它,不需要显式的写p.close()。

    2. 非阻塞

    通俗的讲,非阻塞就是os.popen不会等cmd命令执行完毕就继续下面的代码了,

    在某些应用场景,可能这并不是你期望的行为,那如何让命令执行完后,再执行下一句呢?

    处理方法是使用read()或readlines()对命令的执行结果进行读操作。

    本质上os.popen是非阻塞的,为了实现阻塞的效果,我们使用read()或readlines()对命令结果进行读,由此产生了阻塞的效果。但是,如果你的命令执行无法退出或进入交互模式,这种“读”将形成完全阻塞的情况,表现的像程序卡住了。

    python os.popen OS命令注入漏洞

    demo如下,使用 os.popen,并不能直接阻止注入漏洞,还是取决你传参拼接,它其实还是直接把命令抛给shell处理,如果用户正确传target值,那么没啥问题。

    # coding=utf-8
    import os
    
    
    def print_hi():
        target = "www.baidu.com;ls"
    
        with os.popen('ping -c 2 %s' % target, "r") as p:
            r = p.read()
            print r
    
    
    if __name__ == '__main__':
        print_hi()
    
    

    总结:使用os.popen 并不能直接杜绝os命令注入,如果使用时,请根据业务场景过滤。

    展开全文
  • import os result = os.popen('test.bat') print('ouput result:') print(result.read()) 执行结果,手动输入两个参数,可以看出屏幕结果都输出了。 异常输出: subprocess subprocess 模块允许我们启动一个新进程...

    背景

    最近工作中有遇到这样一种情况,需要执行一个 exe 文件更改某些设置来触发某 Service 工作,而执行这个 exe 程序需要一个屏幕输入参数,这个输入参数也是需要 python 脚本生成的。如果每次都是 cmd 执行这个 exe 程序,把 python 生成的输入参数 copy到 cmd console 上,有些麻烦。所以就研究了一下 python 如何运行其它程序,提高一下工作效率,也增长点知识。

    准备一个 bat 脚本

    写个 Bat 脚本来实现除法运算,命名为 test.bat

    @echo off
    echo division calculator
    set /p a=Please input divident a: 
    set /p b=Please input divisor b: 
    set /a result=%a%/%b%
    echo Result a/b =%a%/%b% = %result%
    pause
    

    执行如下:
    在这里插入图片描述

    python os.system

    python os.system 可以用来执行系统命令,但是没法传递屏幕输入参数,也没法获取程序执行输出结果。

    os.system 来运行一下上面的 test.bat 文件

    import os
    
    result = os.system('test.bat')
    print(result)
    

    执行结果:
    在这里插入图片描述
    注意需要手动输入两个参数,result的结果是 0,表示程序执行成功。

    os.popen

    用于从一个命令打开一个管道,返回结果是一个连接管道的文件对象,该文件对象的操作方法同open(),可以从该文件对象中读取返回结果。如果执行成功,不会返回状态码,如果执行失败,则会将错误信息输出到stdout,并返回一个空字符串。

    import os
    
    result = os.popen('test.bat')
    print('ouput result:')
    print(result.read())
    

    执行结果,手动输入两个参数,可以看出屏幕结果都输出了。
    在这里插入图片描述
    异常输出:
    在这里插入图片描述

    subprocess

    subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。

    一个简单的 test2.bat 文件

    @echo off
    set /p a=Please input a number:
    echo your input is %a%
    pause
    

    在这里插入图片描述
    Python 调用

    import subprocess
    
    p = subprocess.Popen(["test2.bat"], 
                         stdin=subprocess.PIPE, stdout=subprocess.PIPE, encoding="utf-8",universal_newlines=True)                  
    stdout, stderr = p.communicate('12\n') 
    print(stdout)
    

    不用手动输入input 参数了,还可以打印输出结果。

    本人没法成功传两个输入参数,所以没法用上面的 test.bat 来演示了,这里有点遗憾,只能成功自动传入一个输入参数,如果有人知道请留言,不胜感激。

    在这里插入图片描述

    展开全文
  • os.popen

    2019-11-20 16:49:15
    os.popen(command):这种调用方式是通过管道的方式来实现,函数返回一个file对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容),使用os.popen调用test.sh的情况: import os os.popen("./test.sh")...

    os.popen(command):这种调用方式是通过管道的方式来实现,函数返回一个file对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容),使用os.popen调用的情况:

    >>> import os
    >>> cmd=os.popen("""netstat -nlpt|grep -v 'rpc'|awk -F "[ :]+" '{if($4 ~ /0.0.0.0/ || $4 ~ /127.0.0.1/) print $5}'""")
    >>> cmd
    <open file ‘netstat -nlpt|grep -v ‘rpc’|awk -F “[ :]+” ‘{if($4 ~ /0.0.0.0/ || $4 ~ /127.0.0.1/) print $5}’’, mode ‘r’ at 0x7f3113bc65d0>
    >>> cmd.readlines()
    [‘36220\n’, ‘2049\n’, ‘10050\n’, ‘111\n’, ‘80\n’, ‘22\n’, ‘8088\n’, ‘25\n’, ‘8089\n’]

    展开全文
  • os.system方法是os模块最基础的方法,其它的方法一般在该方法基础上封装完成。 二、os.system原理 system函数可以将字符串转化成命令在服务器上运行; 其原理是每一条system函数执行时,都会创建一个子进程在系统上...
  • os.popen、subprocess.Popenos.system 二、具体操作 import os r = os.popen("cat test.txt") print(r.read()) r.close() read()方法获取到执行命令后的内容,也可使用readlines()逐行读取,结果类型为...
  • os.popen可以拿到标准输出,但是拿不到标准错误输出。 subprocess.Popen可以很好的解决问题。 2.案例 if not IS_CONFIG: t_ssh = ssh_servers[acc_ssh_server[center]] stdin, stdout, stderr = t_ssh.exec_...
  • Python os.popen() 方法

    千次阅读 2020-05-29 11:05:11
    Python os.popen() 方法 转自: 概述 os.popen() 方法用于从一个命令打开一个管道。 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.popen(command[, mode[, bufsize]]) 参数 command – 使用的命令。 ...
  • os.system 1.如果想在cmd执行python脚本,可以直接用如下指令 python [xx.py绝对路径] 比如我写了个hello.py的脚本,在脚本里面写入内容:print("hello world!"),放到d盘目录路径为:d:\hello.py 2.os.system...
  • 使用subprocess.Popen替换,对返回串获取,并decode @app.route('/dataxtest', methods=['GET','POST']) def dataxtest(): # os.chdir(r"F:\datax\datax\job\swtb") sqlloadercmd=r"python F:\datax\datax\bin\...
  • [638]python os.popen() 方法

    万次阅读 多人点赞 2019-07-18 19:08:11
    os.popen() 方法用于从一个命令打开一个管道。 在Unix,Windows中有效 语法 popen()方法语法格式如下: os.popen(command[, mode[, bufsize]]) 参数 command – 使用的命令。 mode – 模式权限可以是 ‘r’(默认) ...
  • os.popen()函数用法总结

    2021-08-21 11:40:37
    os.popen()函数与cmd命令窗口之间建立一个双向通道,可以从cmd窗口和程序间相互读取信息 同一文件夹中hello.py文件入下: pritn("hello world") 如果在cmd中执行命令 python hello.py cmd命令窗口中会输出 hello ...
  • 完美解决PYINSTALLER因为-W打包的EXE文件与OS.POPEN和SUBPROCESS.POPEN都执行失败的问题 PYINSTALLER打包遇到PY文件中有OS.POPEN()命令,OS.POPEN执行失败的问题 参考了文章:...
  • OS模块:Operating System 操作系统模块 以下内容转自 https://blog.csdn.net/fengqingting2/article/details/41940149 https://blog.csdn.net/windone0109/article/details/8895875 ...
  • python os.popen

    2021-04-29 08:36:46
    a=os.popen('echo "test"') print(a.readlines()) a=os.popen('ls') print(a.readlines()) popen的输出用readlines 提取,但是带\n ['.idea', 'aa', 'aa_plus', 'main.py', 'PR7_2', 'venv'] ['"test"\n'] ['PR7_2...
  • os.system()和os. popen()都可以执行shell命令,但是他们是有很明显的区别的 os.system 使用os.system执行shell命令,...使用os.popen执行命令需要使用read()将数据读取出来 使用read读出来的数据格式是字符串 ...
  • os.system和os.popen和commands

    万次阅读 2019-09-02 10:54:32
    os.system和os.popen os.system(cmd)的返回值是脚本的退出状态码,只会有0(成功),1,2 os.popen(cmd)返回脚本执行的输出内容作为返回值 当你想把执行命令返回值赋值给一个变量的时候就需要使用os.popen commands ...
  • 之前遇到一个使用os.popen时想屏蔽控制台的stderr打印的问题,在研究这个问题的时候,对os.popen稍微打卡看了下,发现popen其实只是对subprocess.Popen的封装,先把源码粘出来: def popen(cmd, mode="r", ...
  • 该参数是传递给Popen.communicate(),通常该参数的值必须是一个字节序列,如果universal_newlines=True,则其值应该是一个字符串。 universal_newlines 该参数影响的是输入与输出的数据格式,比如它的值默认...
  • 不想使用python某些模块通过,并且数据库也为本机数据库,可以通过命令行直接操作,因此想到使用python 的os.system() 或者 os.popen() 模拟命令行的操作 解决: 命令结构: mysql -u 'username' -p'password' -...
  • (1)subprocess.Popen() import subprocess cmd_string = "sudo chroot /home/ubuntu/hdd_1/zgd/Open_Components/firmware_analysis/GE_F650-192.168.0.232 ./qemu-ppc-static /bin/busybox" p = sub...
  • 问题产生描述 ... p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait() # 从标准输出读出shell命令的输出结果 #rt = p.stdout.read().decode() #
  • 都说野生的动物好,但是放在程序猿身上,我觉得更是一种无奈。没有人指引,没有人教导,有的只是一颗探索,学习的心。...功能需求实现:通过os.popen()函数来调用一个查询数据库的前段exe程序。 情况:通过...
  • 1、在用python执行sqlmap批量扫描时,文件名带中文,os.popen命令执行失败。 ``` def Cmd_Sqlmap(self,path,b="疑似存在注入汇总.txt"): filename = os.path.join(path,b) os.chdir("E:\Python27\sqlmap") ...
  • 自动化测试时难免需要执行adb语句对手机进行操作,这时需要使用os.system(str)或os.popen(str),接下来看下这两个的区别: os.system(): d = os.system("adb devices") print(d) 输出为: 可以得知,os.system()...
  • 在python脚本中调用其他程序,或执行命令行指令,可以用os.system,os.popen,subprocess.popen这三种方式。这三种方式所适用的情况各不相同。区别在于调用程序后执行的操作,函数返回的是调用程序的输出,还是程序...
  • 1、os.system 该函数返回命令执行结果的返回值,并不是返回命令的执行输出, system()函数在执行过程中进行了以下三步操作: 1.fork一个子进程; 2.在子进程中调用exec函数去执行命令; 3.在父进程中调用wait(阻塞...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,139
精华内容 9,255
关键字:

os.popen