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日

相关文章

  • pandas中Timestamp类用法详解

    pandas中Timestamp类用法详解 简介 Timestamp 是 pandas 库中处理日期和时间数据的类,其可以存储时间戳信息,并能够进行格式化、转换、运算等操作。本文将全面介绍 Timestamp 类的用法。 创建 Timestamp 实例 可以通过多种方式创建 Timestamp 实例,例如: import pandas as pd # 从字符…

    python 2023年6月2日
    00
  • padas 生成excel 增加sheet表的实例

    下面来详细讲解如何使用Python中的Pandas库来创建Excel文件并增加Sheet表格的实例。 准备工作 首先,需要安装pandas库。可以使用pip命令在终端中安装: pip install pandas 完成安装后,就可以开始使用Pandas来生成Excel文件了。 创建Excel文件并增加Sheet表 以下是一个简单的Pandas示例代码,用于创…

    python 2023年5月13日
    00
  • Python中的zip函数使用示例

    下面我将为您详细讲解“Python中的zip函数使用示例”的完整攻略。 什么是zip函数 zip函数是Python内置的函数之一,它可以将多个可迭代对象作为参数,将对应位置的元素打包成元组形式,返回一个生成器对象。 zip函数的语法格式如下: zip(iterable1, iterable2, iterable3, …) 其中,iterable1、ite…

    python 2023年6月3日
    00
  • python四种出行路线规划的实现

    讲解“Python四种出行路线规划的实现”的攻略如下: 一、背景介绍 随着移动互联网的发展,人们越来越频繁地出行,出行路线规划也成为人们生活中必不可少的服务之一。Python提供了多种出行路线规划的实现方案,本篇攻略将介绍其中的四种。 二、出行路线规划的四种实现方案 1. 高德地图API 高德地图API提供了多种路线规划的接口,包括步行、公交、驾车等,使用方…

    python 2023年6月3日
    00
  • python通过http下载文件的方法详解

    在Python中,我们可以使用urllib库或requests库来通过HTTP下载文件。下载文件时,我们需要注意文件的大小和下载进度,以便正确地下载文件。本文将通过实例讲解如何使用Python通过HTTP下载文件,包括使用urllib库和requests库,以及两个示例。 使用urllib库下载文件 我们可以使用urllib库的urlretrieve方法来下…

    python 2023年5月15日
    00
  • Python reques接口测试框架实现代码

    首先,Python的requests库是用于发送HTTP/1.1请求。这个库可以完全地替代Python内置的httplib库。但是,这个有额外的好处,需要手动处理cookies、重定向可以直接获取等等。在接口测试中,使用requests库发送HTTP请求并获取响应内容,可以实现接口的功能测试、性能测试、安全测试等多种测试。 以下是实现Python reque…

    python 2023年5月13日
    00
  • python中getopt()函数用法详解

    Python中getopt()函数用法详解 简介 getopt 是 Python 标准库中的一个模块,它提供了解析命令行参数的功能。可以帮助我们轻松地从命令行中获取参数并进行解析,实现自己定义的功能。 函数签名 getopt.getopt(args, shortopts, longopts=[]) getopt 函数接受三个参数: args:要分析的命令行参…

    python 2023年5月13日
    00
  • Python科学画图代码分享

    Python科学画图代码分享 前言 Python是一门优秀的编程语言,尤其在科学计算领域拥有广泛的应用。Python科学画图模块也越来越受到关注。通过本篇文章,我们将学习如何用Python科学画图模块来进行数据可视化,并分享一些常用的代码。 本篇文章将重点介绍以下三个主要的Python科学画图模块: Matplotlib:Python中最常用的科学画图模块之…

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