Python基于多线程实现ping扫描功能示例

Python基于多线程实现ping扫描功能示例的攻略如下:

1. 确定需求,安装需要的模块

首先需要明确的是,我们要实现的是ping扫描功能,而用Python实现ping扫描功能的话,我们还需要一个能够发送ICMP请求的模块,常用的有ping3pythonping等。

这里以ping3模块为例,我们可以通过以下命令进行安装:

pip install ping3

2. 实现ping扫描功能

之后就可以开始实现ping扫描功能了。我们利用多线程并发的方式实现这一功能,通过开启多个线程并行地发送ICMP请求,大大提高了扫描速度。扫描步骤如下:

  1. 输入需要扫描的IP地址段
  2. 构造IP地址列表
  3. 并发地发送ICMP请求,一旦有回应即表示该IP地址可用

以下是示例代码1,可以实现从192.168.0.1到192.168.0.255的IP地址段的ping扫描:

import threading
import queue
import ping3

# 构造IP地址列表
ip_list = ['192.168.0.%d' % i for i in range(1, 256)]

# 设置并发数量及线程队列
concurrent_num = 50
queue_lock = threading.Lock()
work_queue = queue.Queue(len(ip_list))
for ip in ip_list:
    work_queue.put(ip)

# 实现ping的功能
def do_ping(ip):
    response = ping3.ping(ip, timeout=1)
    if response is not None:
        print(f'{ip}: Ping OK')

# 实现线程的功能
def worker():
    while not work_queue.empty():
        queue_lock.acquire()
        ip = work_queue.get()
        queue_lock.release()
        do_ping(ip)

# 开启多线程
threads = []
for i in range(concurrent_num):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    t.join()

print('All done!')

3.优化扫描速度

由于ping扫描功能相对耗时,我们可以通过以下两种方法来优化扫描速度:

  1. 缩减扫描范围,只扫描开启了指定端口的主机

这种方法可以通过构造TCP连接实现,下面是示例代码2,实现只对开启了80端口的主机进行扫描:

import threading
import queue
import socket

# 构造IP地址列表
ip_list = ['192.168.0.%d' % i for i in range(1, 256)]

# 设置并发数量及线程队列
concurrent_num = 50
queue_lock = threading.Lock()
work_queue = queue.Queue(len(ip_list))
for ip in ip_list:
    work_queue.put(ip)

PORT = 80

# 实现检查指定ip的tcp端口是否开放的功能
def do_tcp_scan(ip):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(1)
        if s.connect_ex((ip, PORT)) == 0:
            print(f'{ip}: Port {PORT} is open.')

# 实现线程的功能
def worker():
    while not work_queue.empty():
        queue_lock.acquire()
        ip = work_queue.get()
        queue_lock.release()
        do_tcp_scan(ip)

# 开启多线程
threads = []
for i in range(concurrent_num):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

# 等待所有线程结束
for t in threads:
    t.join()

print('All done!')
  1. 利用协程优化并发发送ICMP请求

通过协程并发执行ping请求也可以提高扫描速度。以下是示例代码3:

import threading
import queue
import ping3
import asyncio

# 构造IP地址列表
ip_list = ['192.168.0.%d' % i for i in range(1, 256)]

# 设置并发数量及线程队列
concurrent_num = 50
queue_lock = threading.Lock()
work_queue = queue.Queue(len(ip_list))
for ip in ip_list:
    work_queue.put(ip)

# 实现ping的功能
async def do_ping(ip):
    response = await loop.run_in_executor(None, ping3.ping, ip)
    if response is not None:
        print(f'{ip}: Ping OK')

# 实现协程的功能
async def worker():
    while not work_queue.empty():
        queue_lock.acquire()
        ip = work_queue.get()
        queue_lock.release()
        await do_ping(ip)

async def main():
    tasks = [worker() for _ in range(concurrent_num)]
    await asyncio.gather(*tasks)

# 开启多线程
loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.run_until_complete(loop.shutdown_asyncgens())
    loop.close()

print('All done!')

总结:

本文讲解了Python基于多线程实现ping扫描功能的攻略,介绍了两种优化扫描速度的方法。其中,示例代码1实现了从192.168.0.1到192.168.0.255的IP地址段的ping扫描,示例代码2实现了只对开启了80端口的主机进行扫描,示例代码3使用了协程并发执行ping请求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python基于多线程实现ping扫描功能示例 - Python技术站

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

相关文章

  • Python批量提取PDF文件中文本的脚本

    下面是“Python批量提取PDF文件中文本的脚本”的完整攻略。 准备工作 安装依赖库 需要在Python环境下安装 pdfminer3k 库,其支持python2和python3。 可以使用 pip 命令在终端中安装: pip install pdfminer3k 下载脚本 从Github上 pdfminer-batch 下载脚本并解压,将所有 .py 文…

    python 2023年6月6日
    00
  • python读取并写入mat文件的方法

    当我们需要在Python中读取.mat文件时,通常会采用SciPy库中的io.loadmat()函数读取.mat文件。而对于写入.mat文件,则可以使用SciPy库中的io.savemat()函数。 具体流程如下: 1. 导入相关库 import scipy.io as sio 2. 读取.mat文件 data = sio.loadmat(‘example.…

    python 2023年6月5日
    00
  • 如何使用Python在MySQL中使用表级锁?

    在MySQL中,表级锁是一种用于控制并发访问的机制,它可以确保多个用户同时访问同一表时不会发生冲突。在Python中,可以使用MySQL连接来执行表级锁查询以下是Python使用表级的完整攻略,包括表级锁的基本语法、使用表级锁的例以及如何在Python中使用表级锁。 表锁的基本语法 在MySQL中,可以使用LOCK TABLES语句来获取表级锁。以下是表级锁…

    python 2023年5月12日
    00
  • Python中使用多进程来实现并行处理的方法小结

    下面是Python中使用多进程来实现并行处理的方法小结的详细攻略。 什么是多进程并行处理? 多进程并行处理是指同时启动多个进程执行任务,从而加快处理速度。在Python中,使用multiprocessing模块来实现多进程并行处理。 如何使用Python多进程并行处理? 1.创建进程 在Python中创建进程有两种方式:使用Process类和使用Pool类。…

    python 2023年5月19日
    00
  • Python实现图片转字符画的代码实例

    当你想将一张图片转换成由字符构成的艺术品时,可以使用Python编程语言来实现这个过程。这个过程包括了读取图像、将图像转换成灰度图、将灰度值映射到字符集合中,最后将结果打印出来或保存到文件中。 下面是这个过程的详细攻略: 步骤一:安装需要的库 在Python中,有很多第三方库可以用来读取和处理图像。这里我们使用 Python Imaging Library …

    python 2023年6月2日
    00
  • 如何使用Python查询某个列中的最大值?

    以下是如何使用Python查询某个列中的最大值的完整使用攻略。 步骤1:导入模块 在Python中,我们需要导入相应的模块来连接数据库和执行查询操作。以下是导入mysql-connector-python模块的基本语法: import mysql.connector 以下是导入psycopg2模块的基本语法: import psycopg2 步骤2:连接数据…

    python 2023年5月12日
    00
  • 使用python爬取微博数据打造一颗“心”

    使用Python爬取微博数据打造一颗“心” 在本攻略中,我们将使用Python编写程序,通过爬取微博数据的方式构建一颗“心”。接下来,将会详细讲解这个过程,包括如何获取微博数据、如何使用Python处理数据、如何使用Python绘制图形。 获取微博数据 获取微博数据需要一定的技术知识和工具。我们需要使用Python中的第三方模块来实现数据的获取。 在本次攻略…

    python 2023年5月14日
    00
  • 浅谈Python脚本开头及导包注释自动添加方法

    以下是关于“Python脚本开头及导包注释自动添加方法”的完整攻略: 问题描述 在编写 Python 脚本时,通常需要添加一些开头注释和导包注释。本文将介绍如何使用工具自动添加这些注释。 解决方法 1. 使用 autopep8 工具 autopep8 是一个 Python 格式化工具,可以自动添加开头注释和导包注释。示例代码如下: autopep8 –in…

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