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()

我认为最让我困惑的是stdoutand stderrargs。是什么 PIPE

一旦我更好地掌握,我可能会解决的另一件事是:

running subprocess.Popen()运行 airodump 时,会弹出控制台窗口显示扫描。有没有办法向用户隐藏它以进行清理?

4

1 回答 1

6

Popen()如果您不想使用,则不必使用。模块中的其他函数,例如.call()use Popen(),为您提供了一个更简单的 API 来做您想做的事情。

所有控制台应用程序都有 3 个“文件”流: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()
于 2013-06-02T11:10:47.107 回答