2015-10-21 59 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