[英]Should the use of subprocess.Popen and subprocess.call be avoided if possible?
[英]When to use subprocess.call() or subprocess.Popen(), running airodump
我有這個小腳本,可以讓您的無線設備進入監控模式。 它執行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時,會彈出控制台窗口,顯示掃描。 有沒有辦法將這個隱藏起來?
如果你不想,你不必使用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.