我正在寫一個TCP SYN掃描器,檢查所有打開的端口。該腳本可以通過使用多個內核來獲取所有打開的端口。在腳本結尾處,當試圖使用get()方法獲取結果時,腳本變得無法使用。在做鍵盤中斷時,會出現一個在代碼下面提到的Traceback。當我使用2個內核時,腳本運行良好,但是當循環運行3次或更多次(使用3個或更多內核)時,腳本會卡住。有關如何進一步處理這個問題的任何建議?多處理器python模塊無法恢復處理結果
==============代碼如下============================= ========
#!/usr/bin/python
import multiprocessing as mp
from scapy.all import *
import sys
import time
results = []
output = mp.Queue()
processes = []
def portScan(ports,output):
ip = sys.argv[1]
for port in range(ports-100,ports):
response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
if response:
if response[TCP].flags == 18 :
print "port number ======> %d <====== Status: OPEN" %(port)
output.put(port)
ports = 0
for loop in range(4):
ports += 100
print "Ports %d sent as the argument"%ports
processes.append(mp.Process(target=portScan,args=(ports,output)))
for p in processes:
p.start()
for p in processes:
p.join()
results = [output.get() for p in processes]
===========輸出======================
./tcpSynmultiprocess.py 10.0.2.1
WARNING: No route found for IPv6 destination :: (no default route?)
Ports 100 sent as the argument
Ports 200 sent as the argument
Ports 300 sent as the argument
port number ======> 23 <====== Status: OPEN
port number ======> 80 <====== Status: OPEN
^CTraceback (most recent call last):
===========回溯===================
^CTraceback (most recent call last):
File "./tcpSynmultiprocess.py", line 43, in <module>
results = [output.get() for p in processes]
File "/usr/lib/python2.7/multiprocessing/queues.py", line 117, in get
res = self._recv()
一個KeyboardInterrupt
打我給它,像30多歲。只是一個小問題:它使用的是「Queue.get」。雖然你的答案仍然成立。 – spectras
@alexisdm我正在使用output.get(timeout = 1)來代替。榮譽指出。不知道我是如何錯過它的。此外Queue.Empty似乎給出了一個錯誤。我現在發佈下面的答案。 – harveyD
@harveyD您不需要使用超時,因爲代碼中沒有什麼可以等待。並且您將端口單獨放入共享隊列中,因此如果有50個開放端口,則應該調用'output.get' 50次,而不是4次(對於您啓動的4個進程)。 – alexisdm