python subprocess无法读取airodump-nd mon0的输出

时间:2017-07-13 04:47:28

标签: python subprocess aircrack-ng

您好我正在尝试输出

airodump-ng mon0

其中mon0是我的无线接口的监控模式。 我想连续读取命令的输出,而不会在某个时间间隔内杀死进程

我的代码如下:

import subprocess
import time

airodump = subprocess.Popen(['airodump-ng','mon0'],stdin=subprocess.PIPE,
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE,
                          universal_newlines=True
                        )
for i in [1, 2, 3, 4 ,5]:
    time.sleep(10)
    o_file = airodump.stdout
    x = o_file.read()
    print(x)
airodump.kill()

程序似乎停留在 x = o_file.read()。 请帮忙。

1 个答案:

答案 0 :(得分:0)

设置stdout=subprocess.PIPEstderr=subprocess.PIPE时存在死锁风险(除非您使用communicate同时读取两个通道),因为如果进程写入标准错误并且您是试图读取标准输出,两者都永远阻止。

在您的情况下,您想要控制阅读,因此communicate不是一个选项。我怀疑你只想合并两个流,所以改变:

stderr=subprocess.PIPE

通过

stderr=subprocess.STDOUT

将标准错误重定向到标准输出,并在o_file.stdout

中获取所有输出+错误

除此之外:for i in [1, 2, 3, 4 ,5]:会更像“pythonic”,如:for _ in range(5):,因为你没有使用i,并且还想象你想要循环10000次:)

但如果您的应用程序在所有情况下都不会立即打印行,那么这并不能解决您的问题,因为read()正在阻止,并且您需要它在您想要时完全停止,所以我会:

  • 创建流程
  • 创建一个线程来读取循环中的行,使用共享布尔值来停止读取(因为如果输出缓冲区中有行,则杀死进程是不够的)
  • 等一段时间
  • 将布尔值设置为True&终止流程

像这样:

import subprocess
import time
import threading

stop_output = False

def f(p):
    global stop_output
    while True:
        l = p.stdout.readline()
        if not l or stop_output:
            break
        print(l.rstrip())   # or whatever you want to do with the line

airodump = subprocess.Popen(['airodump-ng','mon0'],stdin=subprocess.PIPE,
                      stdout=subprocess.PIPE,
                      stderr=subprocess.STDOUT,
                      universal_newlines=True
                    )
t = threading.Thread(target=f,args=(airodump,))
t.start()
time.sleep(10)
# kill the process and stop the display after 10 seconds whatever happens
airodump.terminate()
stop_output = True