python多线程扫描端口(线程池)

下面我将详细讲解“python多线程扫描端口(线程池)”的完整攻略。

线程池的概念

线程池是一种应对高并发、高频率任务的一种解决方案,它将线程复用起来,减少了创建、销毁线程的开销,从而提高了程序的效率。

当我们需要同时进行多个扫描时,就需要采用多线程的方式来进行。而线程池则是一种比较好用的多线程技术,它可以控制线程的数量,避免资源的浪费,让线程在需要时自动重用。

实现步骤

下面是实现“python多线程扫描端口(线程池)”所需要的步骤:

  1. 导入必要的库,例如threadingqueue等库。
import threading
import queue
  1. 定义扫描函数

定义一个扫描给定IP的端口的函数,可以通过socket库的connect_ex()方法来实现。

def scan_port(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        conn = s.connect_ex((ip, port))
        if conn == 0:
            print('[+]%d open' % port)
        s.close()
    except:
        pass
  1. 定义线程函数

定义一个线程函数work,实现从任务队列中获取任务并且执行,直到任务队列为空为止。

def work():
    while True:
        try:
            ip, port = q.get(block=False)
            scan_port(ip, port)
        except queue.Empty:
            break
  1. 定义主函数

在主函数中,将IP列表中所有的IP和需要扫描的所有端口添加到任务队列q中,然后创建多个线程来执行work函数,最后等待所有线程执行完成。

if __name__ == '__main__':
    threads = []
    q = queue.Queue()
    for ip in ips:
        for port in ports:
            q.put((ip, port))
    for i in range(10):
        t = threading.Thread(target=work)
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

在上述代码中,我们创建了10个线程,然后将所有待扫描的任务加入到任务队列q中,线程池中的每个线程都会从队列中获取一个任务并执行,直到队列为空。

  1. 示例一

下面是一个简单的示例,演示如何扫描一个IP地址段的80端口。

import queue
import threading
import socket

def scan_port(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        conn = s.connect_ex((ip, port))
        if conn == 0:
            print('[+] %s:%d Open' % (ip, port))
        s.close()
    except:
        pass

def work():
    while True:
        try:
            ip, port = q.get(block=False)
            scan_port(ip, port)
        except queue.Empty:
            break

if __name__ == '__main__':
    threads = []
    q = queue.Queue()
    for i in range(1, 255):
        q.put(('192.168.1.%d' % i, 80))
    for i in range(10):
        t = threading.Thread(target=work)
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

在这个示例中,我们首先定义了扫描端口的函数scan_port(),然后定义了线程函数work()。在主函数中,我们将IP地址段1~254中的所有主机和80端口加入到任务队列q中,并创建10个线程来执行所有任务。

  1. 示例二

下面是一个稍微复杂一些的示例,它可以同时扫描多个端口和多个IP地址段。

import queue
import threading
import socket

def scan_port(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(1)
    try:
        conn = s.connect_ex((ip, port))
        if conn == 0:
            print('[+] %s:%d Open' % (ip, port))
        s.close()
    except:
        pass

def work():
    while True:
        try:
            ip, port = q.get(block=False)
            scan_port(ip, port)
        except queue.Empty:
            break

if __name__ == '__main__':
    threads = []
    q = queue.Queue()
    ips = ['192.168.1.%d' % i for i in range(1, 51)]
    ports = [21,22,23,25,53,66,80,81,135,139,443,445,1433,1521,3306,3389,5432,5900,5901,6379,7001,8000,8080,8090,8888]
    for ip in ips:
        for port in ports:
            q.put((ip, port))
    for i in range(10):
        t = threading.Thread(target=work)
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

在这个示例中,我们首先定义了两个列表nd的所有主机和80端口加入到任务队列q中,并创建10个线程来执行所有任务。最终输出所有开放的端口。

这就是“python多线程扫描端口(线程池)”的完整攻略了,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python多线程扫描端口(线程池) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python调用钉钉自定义机器人的实现

    下面我就为大家详细讲解如何使用Python调用钉钉自定义机器人,并提供两条示例说明。 1. 准备工作 钉钉账号,拥有创建自定义机器人的权限; Python的requests库,可使用pip进行安装; 2. 获取自定义机器人Webhook地址 在钉钉中创建一个自定义机器人,然后获取其Webhook地址。 具体步骤: 进入钉钉工作台,点击自定义机器人,进入自定义…

    python 2023年5月23日
    00
  • Python 调用VC++的动态链接库(DLL)

    Python 是一种非常流行的解释型编程语言,在许多领域都得到了广泛的使用。而 VC++ 是一种强类型的编程语言,它与 Windows 平台紧密结合,因此也得到了很高的支持。如果你想结合这两种语言开发软件,那么 Python 调用 VC++ 的动态链接库(DLL)就是一个非常重要的技术。 本文将详细讲解如何在 Python 中调用 VC++ 的 DLL。具体…

    python 2023年6月5日
    00
  • Python随机函数random随机获取数字、字符串、列表等使用详解

    Python随机函数random随机获取数字、字符串、列表等使用详解 在 Python 中,我们可以使用 random 模块中的函数来实现随机操作。 random 模块提供了很多随机操作的函数,我们可以通过它们随机获取数字,字符串,列表等。 1. 简单的随机函数示例 下面是一个简单的随机函数示例,其中我们使用 random 模块中的 random() 函数来…

    python 2023年5月14日
    00
  • pytest之assert断言的具体使用

    pytest之assert断言的具体使用 在Python中,pytest是一个流行的测试框架,它提供了许多有用的功能来编写和运行测试。其中一个重要的功能是assert断言,它可以用来验证代码的正确。本文将为您提供一个完整攻略,详细讲解pytest中assert断言的具体使用,包括语法、见的断言方法和两个示例说明。 1. assert断言语法 在pytest中…

    python 2023年5月14日
    00
  • 怎么快速自学python

    以下是我对“怎么快速自学python”的完整攻略的讲解。 1. 制定合理的学习计划 要想快速自学Python,首先要制定一份合理的学习计划。可以从以下几个方面考虑: 学习内容梳理:根据自己的实际情况、学习目标和需求,制定详细的学习计划。可以按照Python的基础语法、常用模块、web开发、数据分析等方向进行梳理。 合理分配时间:合理的学习计划应该尽量兼顾工作…

    python 2023年5月30日
    00
  • 一文详解Python中logging模块的用法

    一文详解Python中logging模块的用法 在Python中,logging模块是一个非常重要的模块,它可以帮助我们记录程序运行过程中的各种信息,包括错误、警告、调试信息等。本文将详讲解Python中logging模块的用法,并提供两个示例来说明它们的使用。 logging模块的基本用法 logging模块的功能 logging模块可以帮助我们记录程序运…

    python 2023年5月14日
    00
  • python入门课程第一讲之安装与优缺点介绍

    Python入门课程第一讲之安装与优缺点介绍 安装Python Windows 操作系统 访问Python官方网站,https://www.python.org/downloads/windows/,选择操作系统版本,推荐选择最新版本的Python 3。 下载安装包,点击“Download Windows x86-64 executable installe…

    python 2023年5月30日
    00
  • python pip安装包出现:Failed building wheel for xxx错误的解决

    问题描述: 在使用pip安装Python包时,可能会出现Failed building wheel for xxx的错误提示。这种错误通常出现在安装需要编译C扩展的Python包时,由于没有编译环境或缺失一些依赖库,导致安装失败。 解决方案: 以下是解决此问题的两种方法: 方法一:安装编译环境和依赖库 第一步:安装编译环境和依赖库 对于 Debian/Ubu…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部