使用python的快速扫描端口

时间:2019-02-06 07:46:19

标签: python multithreading scapy

这是我的端口扫描程序代码:

from scapy.all import *
from datetime import datetime
import threading

threadlock = threading.Lock()

def TCPort(ip_addr, port):
    time = 1   # max time to send packages to a port is 1 seconds

    threadlock.acquire()
    pkt = IP(dst=ip_addr)/TCP(dport=port,flags="S")
    ans = sr1(pkt, timeout=time, verbose=0)
    if(str(type(ans))=="<type 'NoneType'>"):
        #port is closed
        pass
    elif ans.haslayer(TCP):
         if (ans.getlayer(TCP).flags=="A") or (ans.getlayer(TCP).flags=="SA"):
        # port sent a SYN or SYN-ACK answer, so answer with RST to close
        # the connection and print the port
        sr1(IP(dst=ip_addr)/TCP(dport=port,flags="S"), timeout=time, verbose=0)
        print port,"open".rjust(9-len(str(port)))
    threadlock.release()

#main
ip_addr = "192.168.1.33"

ports = range(1,500)
start = datetime.now()
print "Started on", start.strftime('%Y-%m-%d %H:%M:%S')

for port in ports:
    t1 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t2 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t3 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t4 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t5 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t6 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t7 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t8 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t9 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t10 = threading.Thread(target=TCPort, args=(ip_addr,port))
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t5.start()
    t6.start()
    t7.start()
    t8.start()
    t9.start()
    t10.start()
    t1.join()
    t2.join()
    t3.join()
    t4.join()
    t5.join()
    t6.join()
    t7.join()
    t8.join()
    t9.join()
    t10.join()

print "Finished on", datetime.now()-start

代替对线程执行10个var操作,如何在更少的行和更少的变量中执行线程?

***此问题已编辑为更具体的问题

***忽略此段落。系统不允许我发布编辑内容,因为我需要再写一些单词,因此您可以忽略此段(顺便说一句,如果您阅读此段,我将很高兴学习如何绕过此限制)

1 个答案:

答案 0 :(得分:2)

我建议您使用基于池的方法,在此方法中,您将创建一组线程/进程,然后向它们提供要检查的端口。 Threading pool similar to the multiprocessing Pool? 使用线程的方法是什么,在这种情况下,这应该是您所需要的。这可以为您管理大部分烦人的线程。