我有这个小脚本可以让您的无线设备进入监控模式。它执行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()
我认为让我最困惑的是stdout
和stderr
args。什么是PIPE
?
一旦我得到更好的把握,我可以修复自己的另一件事是:
当running subprocess.Popen()
并运行airodump时,控制台窗口会弹出,显示扫描结果。有没有办法从用户那里隐藏这些东西呢?
答案 0 :(得分:6)
如果您不想,则不必使用Popen()
。模块中的其他功能(例如.call()
使用Popen()
)为您提供了一个更简单的API来执行您想要的操作。
所有控制台应用程序都有3个“文件”流:stdin
用于输入,stdout
和stderr
用于输出。应用程序决定在哪里写;通常是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()