我正在写一个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