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

3
我有一个小脚本,可以将您的无线设备切换到监视模式。它进行了一个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参数。什么是PIPE

另一件可能需要我自己解决的事情是:

当运行subprocess.Popen()并运行airodump时,控制台窗口会弹出显示扫描结果。是否有方法可以隐藏这个窗口,以使用户界面更加干净整洁?

1个回答

6

如果您不想使用Popen(),那么您可以使用模块中的其他函数,比如.call()。这些函数使用Popen(),为您提供了一个更简单的 API,用于完成您想要的操作。

所有的控制台应用程序都有三个“文件”流:输入的stdin和输出的stdoutstderr。应用程序决定将什么写到哪里;通常将错误和诊断信息写到stderr,其余内容写到stdout。如果您想在 Python 程序中捕获任何一个输出流的输出,您可以指定subprocess.PIPE参数,以便将数据流重定向到您的程序。因此得名。

如果您想捕获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()

感谢您的详细回复。我之前尝试使用check_output进行扫描,但不得不使用Popen(),因为我的扫描会一直运行,直到我在终端手动按下ctrl-c停止,我认为只有Popen()具有terminate()方法?如果我错了,请纠正我。 - Jake Poulter
@JakePoulter:确实,如果airdump-ng一直运行直到终止,你需要使用Popen()并将stdout重定向到你的Python程序。我提供了一个示例。 - Martijn Pieters
再次感谢您的回复。我明白它是如何工作的,但这会导致脚本进入无限循环,因为airodump会一直运行,直到您手动停止该进程,从而使for循环不断写入行。 - Jake Poulter
你需要决定何时从管道中读取足够的内容并停止进程;我不知道你在这里寻找什么。 :-) - Martijn Pieters
一旦你得到了所需的内容,使用 break 来结束循环。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接