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

yizhihongxing

下面我将详细讲解“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实现原神抽卡的方法,让我们在游戏中更自由的玩耍。 2.实现过程 2.1.创建卡池 首先,我们需要创建原神抽卡的模拟数据。我们将创建包含武器和角色两…

    python 2023年6月13日
    00
  • 对Python3之方法的覆盖与super函数详解

    对Python3之方法的覆盖与super函数详解 什么是方法覆盖? 方法覆盖是指在子类中重新定义(覆盖)从父类中继承的方法。当一个子类中定义了与父类中同名的方法时,子类对象调用该方法时会优先调用子类中定义的方法,而不再调用父类中定义的方法。 Python中使用方法覆盖的特性,可以实现运行时动态修改对象的行为,是一种非常灵活的编程方式。 方法覆盖应用示例 cl…

    python 2023年6月5日
    00
  • python实现对excel进行数据剔除操作实例

    接下来我将为您详细讲解“python实现对excel进行数据剔除操作实例”的完整实例教程: 前置知识 在这个实例中,您需要掌握以下几个知识点: Python中的pandas库 Excel文件的读取和写入 步骤1:安装pandas库和openpyxl库 在开始这个实例之前,我们需要安装pandas和openpyxl库。您可以使用以下命令在命令行中安装这两个库:…

    python 2023年5月13日
    00
  • Python中turtle库的使用实例

    Python中的turtle库是一个入门级的绘图库,可以用来绘制各种形状和图案。下面将使用两个实例来详细讲解turtle库的使用方法,包括基本的绘图命令、图案重复绘制及文字输出等。 示例一:绘制正方形 在开始绘图之前,需要先导入turtle库,并创建一个画布以及一只画笔(turtle对象)。通过调用turtle库中的方法,实现画笔向前/后移动、绘制线条、变更…

    python 2023年5月31日
    00
  • 利用Python代码实现一键抠背景功能

    抠图是一种常见的图像处理技术,用于将图像中的前景对象从背景中分离出来。本文将详细讲解利用Python代码实现一键抠背景功能的完整攻略,包括如何使用OpenCV和深度学习模型实现抠背景功能。 使用OpenCV实现抠背景功能 在Python中,我们可以使用OpenCV库实现抠背景功能。以下是一个示例,演示如何使用OpenCV实现抠背景功能: import cv2…

    python 2023年5月15日
    00
  • python正则表达式之re.match()与re.search()的用法及区别

    以下是“Python正则表达式之re.match()与re.search()的用法及区别”的完整攻略: 一、问题描述 在Python中,我们可以使用re模块中的match()函数和search()函数来匹配字符串。本文将详细讲解Python正则表达式中match()函数和search()函数的用法及区别。 二、解决方案 2.1 match()函数和searc…

    python 2023年5月14日
    00
  • pytorch查看通道数 维数 尺寸大小方式

    PyTorch 是一种流行的开源深度学习框架,我们经常需要查看数据的通道数、维数以及尺寸大小等信息。在本文中,我将为大家介绍在 PyTorch 中如何查看数据的通道数、维数、尺寸大小的方法。 查看数据的通道数 在 PyTorch 训练和测试深度学习模型时,经常需要查看一个张量的通道数。我们可以使用 size() 函数来获取张量的形状,然后通过形状的最后一个元…

    python 2023年6月2日
    00
  • Python使用itertools模块实现排列组合功能示例

    以下是“Python使用itertools模块实现排列组合功能”的完整攻略。 模块介绍 itertools是Python的标准库之一,提供用于高效利用内存的各种迭代器函数。在处理排列组合问题时,itertools提供的几个函数特别有用,包括: itertools.permutations(iterable, r=None):返回可迭代对象iterable的所…

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