• 用threading和Queue模块实现多线程的端口扫描器


    一.Queue模块基础

    q = Queue.Queue()    
    q.qsize()           返回队列的大小  
    q.empty()         如果队列为空,返回True,反之False  
    q.full()          如果队列满了,返回True,反之False
    q.full              与 maxsize 大小对应  
    q.get([block[, timeout]]) 获取队列,timeout等待时间  
    q.get_nowait()         相当q.get(False)
    q.put(item)           写入队列,timeout等待时间  
    q.put_nowait(item)    相当q.put(item, False)
    q.task_done()         在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
    q.join()             实际上意味着等到队列为空,再执行别的操作

    二.threading模块基础


    t = threading.Thread             使用它来创建线程
    t.start()                           开始线程的执行
    t.run()                           包含了线程实际执行的内容
    t.join(timeout=None)               被调用 join() 方法的线程会一直阻塞调用者的线程,直到自己结束
    t.name                           用于鉴别进程的一个字符串
    t.getName()/t.setName()           为后向兼容而保留的方法,现在请直接通过 name 属性来访问
    t.ident                           如果线程还未开始,则值为 None
    t.is_alive()                       返回本进程是否是 alive 状态
    t.daemon                       标明本进程是否为“daemon thread”。一定要在 start() 被调用前设定,否则引发 RuntimeError。
    t.isDaemon() / t.setDaemon()        为后向兼容而保留的方法,现在请直接访问 daemon 属性
    lock = threading.Lock
    lock.acquire(blocking=True,timeout=-1)        获取一个锁
    lock.release()                              释放一个锁

    三.多线程端口扫描器

    # -*- coding: utf-8 -*-
    __author__ = 'Dleo'
    import sys
    import socket
    import threading
    import Queue
    
    ports=[21,80,445,3389]
    queue = Queue.Queue()
    
    def ip_c(ip):
        new_ip = []
        for ip_c in range(1,255):
            new_ip.append(str(ip) + "." + str(ip_c))
            #print new_ip
        return new_ip
    
    class ThreadNum(object):
        def __init__(self, queue):
            self.queue = queue
            self.lock = threading.Lock()
        def port_open(self):
            while True:
                try:
                    try:
                        ip = self.queue.get(timeout=1)
                    except:
                        break
                    for port in ports:
                        socket.setdefaulttimeout(0.5)
                        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        if s.connect_ex((ip, port)) == 0:
                            self.lock.acquire()
                            print (ip + ':' + str(port) + ' is openning')
                            self.lock.release()
                        s.close()
                except:
                    pass
                self.queue.task_done()
        def run (self):
            tmp = []
            for i in range(255):
                t = threading.Thread(target=self.port_open)
                t.setDaemon(True)
                t.start()
                tmp.append(t)
            for t in tmp:
                t.join()
                
    if __name__ == '__main__':
        if len(sys.argv) != 2:
            print "please put ip like this '127.0.0' "
            sys.exit()
        ip = sys.argv[1]
        for i in ip_c(ip):
            queue.put(i)
        t = ThreadNum(queue)
        t.run()

    效果图:

  • 相关阅读:
    转载:SSH无法连接error:couldnotloadhostkey:/etc/ssh/ssh_host_dsa_key
    docker修改运行中的容器端口映射
    查看iis进程(w3wp)所对应的程序池名称 / 端口使用情况
    jenkins+sonar+钉钉 发布.net
    windows使用jenkins 搭建 .net 自动发布IIS站点平台
    Redis
    20191209---自定义异常类--转载
    借助pywinauto实现本地文件上传--转载
    python虚拟环境搭建,虚拟环境迁移,三方库安装
    python 在不同层级目录import 模块的方法
  • 原文地址:https://www.cnblogs.com/Dleo/p/5783487.html
Copyright © 2020-2023  润新知