我正在编写TCP SYN扫描程序,检查所有已打开的端口。该脚本可以通过使用多个核心来获取所有打开的端口。在脚本结束时,尝试使用get()方法获取结果时,脚本将无法运行。在执行键盘中断时,会出现一个在代码下面提到的Traceback。当我使用2个内核时,脚本运行正常但是当循环运行3次或更多次(使用3个或更多内核)时,脚本会卡住。关于如何进一步解决这个问题的任何建议?
==============代码如下============================== =======
user_id
===========输出======================
#!/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):
一个KeyboardInterrupt
答案 0 :(得分:2)
默认情况下,Queue.get()
会阻塞,直到有数据要返回,如果所有进程都已结束,则不会阻止。
您可以使用output.get(False)
来阻止不返回任何内容的进程(您必须处理Queue.Empty
异常)。
或者,由于队列大小也可能大于进程数,因此您应该使用Queue.qsize()
而不是processes
:
results = [output.get() for x in range(output.qsize())]
答案 1 :(得分: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