读取os.popen()输出不会返回任何内容

时间:2019-01-18 00:53:09

标签: python python-3.x python-2.7 shell

我正在开发一个python脚本来收集有关Linux系统的几条信息,现在我正尝试使用os.popen()来收集侦听的UDP e TCP端口的列表,下面是该函数的样子:< / p>

def ports(self):
    # Gets a few lines of information about open TCP ports
    tcpOpenPorts = os.popen("netstat -tulpn | grep -P 'tcp\b'").read()
    print(tcpOpenPorts)
    # Gets a few lines of information about open UDP ports
    udpOpenPorts = os.popen("netstat -tulpn | grep -P 'tcp\b'").read()
    print(udpOpenPorts)

我面临的问题是:当我使用变量tcpOpenPortsudpOpenPorts上方的函数执行脚本时,即使shell命令是

netstat -tulpn | grep -P 'tcp\b'

正常工作。

这是命令的示例输出:

tcp        0      0 127.0.0.1:63342         0.0.0.0:*               OUÇA       3244/java
tcp        0      0 0.0.0.0:111             0.0.0.0:*               OUÇA       539/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               OUÇA       686/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               OUÇA       4466/cupsd
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               OUÇA       3244/java

我使用os模块的方式有什么问题吗?

1 个答案:

答案 0 :(得分:2)

单引号会阻止外壳程序处理反斜杠,但外壳程序不是您唯一需要停止处理反斜杠的操作。 Python字符串文字语法还为反斜杠赋予了特殊含义,因此外壳程序接收的是退格字符,而不是反斜杠和b。

使用原始字符串文字来避免Python的反斜杠处理:

os.popen(r"netstat ...")

(顺便说一句,我通常建议您使用subprocess模块,但是不使用subprocess将管道命令与shell=True一起使用是很尴尬的,使用shell=True会使大多数subprocess的好处。但是,如果您发现自己在运行时构建命令字符串,则一定要切换到subprocess而不是尝试使用字符串格式来处理。)