何时使用subprocess.call()或subprocess.Popen(),运行airodump

时间:2013-06-02 11:00:45

标签: python subprocess

我有这个小脚本可以让您的无线设备进入监控模式。它执行airodump扫描,然后在终止扫描后将输出转储到file.txt或变量,这样我就可以刮掉BSSID以及我可能需要的任何其他信息。

我觉得我没有理解subprocess.call()subprocess.Popen()之间的概念或区别。

这就是我目前所拥有的:

def setup_device(): 
    try:
        output = open("file.txt", "w")
        put_device_down = subprocess.call(["ifconfig", "wlan0", "down"])
        put_device_mon = subprocess.call(["iwconfig", "wlan0", "mode", "monitor"]) 
        put_device_up = subprocess.call(["iwconfig", "wlano", "up"])
        start_device = subprocess.call(["airmon-ng", "start", "wlan0"])
        scanned_networks = subprocess.Popen(["airodump-ng", "wlan0"], stdout = output)  
        time.sleep(10)  
        scanned_networks.terminate()

    except Exception, e:
         print "Error:", e

我仍然对使用subprocess.call()subprocess.Popen()

的地点和时间以及使用方式一无所知

我认为让我最困惑的是stdoutstderr args。什么是PIPE

一旦我得到更好的把握,我可以修复自己的另一件事是:

running subprocess.Popen()并运行airodump时,控制台窗口会弹出,显示扫描结果。有没有办法从用户那里隐藏这些东西呢?

1 个答案:

答案 0 :(得分:6)

如果您不想,则不必使用Popen()。模块中的其他功能(例如.call()使用Popen())为您提供了一个更简单的API来执行您想要的操作。

所有控制台应用程序都有3个“文件”流:stdin用于输入,stdoutstderr用于输出。应用程序决定在哪里写;通常是stderr的错误和诊断信息,其余为stdout。如果要在Python程序中捕获这些输出中的任何一个的输出,请指定subprocess.PIPE参数,以便将“stream”重定向到您的程序中。因此这个名字。

如果要捕获airodump-ng wlan0命令的输出,最简单的方法是使用subprocess.check_output()函数;它会为你处理PIPE论证:

scanned_networks = subprocess.check_output(["airodump-ng", "wlan0"])

现在output包含airodump-ng写入其stdout信息流的内容。

如果您需要对流程有更多控制权,那么您需要使用Popen()类:

proc = subprocess.Popen(["airodump-ng", "wlan0"], stdout=subprocess.PIPE)
for line in proc.stdout:
    # do something with line
proc.terminate()