2015-10-21 104 views
0

我正在寫一個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

回答

2

默認情況下,Queue.get()會阻塞,直到它有數據返回爲止,如果所有進程都已經結束,則不會。

您可以使用output.get(False)不會阻止任何不返回的進程(您將必須處理Queue.Empty異常)。

或者,由於隊列的大小也可以比的進程數越大,你應該寧願使用Queue.qsize(),而不是processes

results = [output.get() for x in range(output.qsize())] 
+1

打我給它,像30多歲。只是一個小問題:它使用的是「Queue.get」。雖然你的答案仍然成立。 – spectras

+0

@alexisdm我正在使用output.get(timeout = 1)來代替。榮譽指出。不知道我是如何錯過它的。此外Queue.Empty似乎給出了一個錯誤。我現在發佈下面的答案。 – harveyD

+0

@harveyD您不需要使用超時,因爲代碼中沒有什麼可以等待。並且您將端口單獨放入共享隊列中,因此如果有50個開放端口,則應該調用'output.get' 50次,而不是4次(對於您啓動的4個進程)。 – alexisdm

0
#!/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() 



for size in range(output.qsize()): 
    try: 
     results.append(output.get()) 
    except: 
     print "Nothing fetched from the Queue..." 

print results