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网络编程之多线程同时接受和发送

    一、什么是Python网络编程之多线程同时接受和发送? Python网络编程是指使用Python语言实现网络通信的过程,包括传输协议、网络编程框架、数据交互等。多线程同时接受和发送是指一个Python网络应用程序可以同时处理多个客户端的接入请求,并且能在同时接收和发送数据时保持正常运行。 在多线程同时接受和发送的过程中,一个Python服务器可以同时处理多个…

    python 2023年5月18日
    00
  • python pandas获取csv指定行 列的操作方法

    要想获取csv指定行列的数据,需要使用Python的pandas库。下面是python pandas获取csv指定行列的操作方法的攻略: 第一步:导入pandas库和读取csv文件 在代码中先导入pandas库,然后使用pandas的read_csv()方法读取csv文件。下面是代码示例: import pandas as pd df = pd.read_c…

    python 2023年6月3日
    00
  • Python 实现数据库(SQL)更新脚本的生成方法

    关于”Python 实现数据库(SQL)更新脚本的生成方法”,这里我将提供以下步骤: 步骤1:安装python库 首先需要安装Python库,其中最主要的是pymysql库(关于pymysql库的参考链接:https://pypi.org/project/PyMySQL/)。可以使用pip命令进行安装。 pip install pymysql 步骤2:编写P…

    python 2023年6月3日
    00
  • Python发展史及网络爬虫

    Python发展史及网络爬虫 Python发展史 Python是一种高级编程语言,由Guido van Rossum于1989年发明,最初的目的是作为一种易于学习和阅读的脚本语言。自Python的发明以来,它已经经历了多次重大更新和版本发布,例如Python 2和Python 3。 Python 2是最受欢迎的版本之一,其基本结构是函数、条件、循环和对象。它…

    python 2023年5月14日
    00
  • python实现简单的聊天小程序

    下面是”python实现简单的聊天小程序”的完整攻略: 介绍 聊天小程序是一种允许用户实时交流的应用程序。Python是一种流行的编程语言,有许多库可以用来创建聊天小程序。在这份教程中,我们将介绍如何使用Python创建一个简单的聊天小程序。 步骤 1. 安装必要的库 使用Python创建聊天程序,需要使用socket, threading和tkinter库…

    python 2023年5月19日
    00
  • pip报错“ModuleNotFoundError: No module named ‘pip._vendor.msgpack’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ModuleNotFoundError: No module named ‘pip._vendor.msgpack’”错误。这个错误通常是由以下原因之一引起的: pip版本过低:如果您的pip版本过低,则可能会出现此错误。在这种情况下,需要升级pip版本。 损坏的pip安装:如果您的pip安装已损坏,则可能会出现…

    python 2023年5月4日
    00
  • 解决Keyerror ”acc” KeyError: ”val_acc”问题

    当模型在训练过程中出现 ‘KeyError: “acc”‘ 或者 ‘KeyError: “val_acc”‘ 错误时,说明在训练历史记录中找不到对应的准确率指标。在解决这个问题之前,我们先来了解一下准确率指标。 准确率(accuracy)是一个非常常用的模型性能指标,它用来衡量分类模型的预测结果与真实标签一致的概率。在Keras训练模型时,常用的准确率指标包…

    python 2023年5月13日
    00
  • Python正则表达式反对Latin-1字符编码?

    【问题标题】:Python regex against Latin-1 character encoding?Python正则表达式反对Latin-1字符编码? 【发布时间】:2023-04-05 02:08:02 【问题描述】: 我有一个包含(我相信)latin-1 编码的文件。 但是,我无法将正则表达式与此文件匹配。 如果我 cat 文件,它看起来很好:…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部