我正在开发一个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)
我面临的问题是:当我使用变量tcpOpenPorts
和udpOpenPorts
上方的函数执行脚本时,即使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
模块的方式有什么问题吗?
答案 0 :(得分:2)
单引号会阻止外壳程序处理反斜杠,但外壳程序不是您唯一需要停止处理反斜杠的操作。 Python字符串文字语法还为反斜杠赋予了特殊含义,因此外壳程序接收的是退格字符,而不是反斜杠和b。
使用原始字符串文字来避免Python的反斜杠处理:
os.popen(r"netstat ...")
(顺便说一句,我通常建议您使用subprocess
模块,但是不使用subprocess
将管道命令与shell=True
一起使用是很尴尬的,使用shell=True
会使大多数subprocess
的好处。但是,如果您发现自己在运行时构建命令字符串,则一定要切换到subprocess
而不是尝试使用字符串格式来处理。)