Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!

1. 简介:

这款“IP网段扫描工具”是网络管理员和普通用户的必备神器,轻松帮助你检查每个网段下的IP是否在线,避免了手动逐一检查的繁琐。只需要输入网段,它便会自动生成所有IP,快速对每个IP进行Ping检测,实时展示结果并提供详细的在线/掉线统计。工具的并发扫描方式,确保了高效性,让扫描过程变得既快速又流畅。

不仅如此,它还为用户提供了丰富的功能,像是清晰的进度条、动态更新的表格、日志输出以及导出功能,都让整个扫描过程充满了互动感与可视化,数据一目了然。用户还可以随时中止扫描,避免浪费时间。

无论是日常网络维护、设备故障排查,还是批量IP监测,这款工具都能帮助你轻松搞定。简洁、实用、快速,让网络管理变得更智能,更高效。

功能模块介绍:

输入网段与IP扫描:

  • 用户可以通过输入网段(如 192.168.1,192.168.2)来启动扫描。工具会自动生成每个网段下的所有IP,并开始对每个IP进行Ping操作,快速检测其在线状态。

并发Ping操作:

  • 为了提高效率,工具在扫描时采用并发技术,最多同时检测20个IP,通过异步执行的方式提高扫描速度。

进度条:

  • 用户可以清晰看到当前扫描的进度,实时更新的进度条让等待变得更加轻松,不再觉得枯燥。

表格展示:

  • 扫描结果会自动填充到表格中,最多每行显示10个IP地址。在线IP用绿色标记,掉线IP用灰色标记,帮助用户一目了然地看到每个IP的状态。

日志输出与导出:

  • 所有扫描的日志和结果会被记录到文本框中,并且可以选择将“在线IP”或“掉线IP”导出为文本文件,或者导出完整的日志记录,方便后续查看或备份。

停止扫描:

  • 如果扫描过程中需要中断,用户可以随时点击“停止扫描”按钮,立即停止当前的Ping任务,并恢复按钮状态。

导出功能:

用户可以选择导出不同类型的数据(在线IP、掉线IP或日志记录),并将数据保存为文本文件,方便后期分析和记录。

2. 运行效果:

请添加图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.总 结:

这款“IP网段扫描工具”通过图形界面和异步技术,简化了IP扫描的操作流程,提升了扫描效率。它不仅能高效检测每个网段的IP状态,还能实时反馈扫描进度,并提供导出功能,方便用户进一步分析。无论是在家庭网络管理,还是公司网络安全维护中,都能作为得力助手。简单易用的界面和丰富的功能,让网络管理不再是繁琐的工作,反而带来了一些轻松的乐趣!

4. 相关源码:

import sys
import asyncio
import subprocess
from queue import Queue
from PyQt5.QtCore import QThread, pyqtSignal, QTimer
from PyQt5.QtGui import QColor, QFont
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit, QTextEdit, QProgressBar, QTableWidget, QTableWidgetItem, QMessageBox, QFileDialog, QInputDialogclass PingThread(QThread):# 定义信号result_signal = pyqtSignal(str, str)  # 传递IP和状态progress_signal = pyqtSignal(int)  # 用于更新进度条的信号stop_signal = pyqtSignal()  # 用于停止线程的信号def __init__(self, ip_queue, total_ips, parent=None):super().__init__(parent)self.ip_queue = ip_queueself.total_ips = total_ipsself.pinged_ips = 0  # 已ping的IP数量self.stop_requested = False  # 停止请求标志位self.online_ips = []  # 在线IP列表self.offline_ips = []  # 掉线IP列表def run(self):loop = asyncio.new_event_loop()asyncio.set_event_loop(loop)loop.run_until_complete(self.ping_ips())async def ping_ips(self):tasks = []while not self.ip_queue.empty() and not self.stop_requested:ip = self.ip_queue.get()task = asyncio.create_task(self.ping(ip))tasks.append(task)if len(tasks) >= 20:  # 每次最多并发20个请求await asyncio.gather(*tasks)tasks.clear()if tasks:await asyncio.gather(*tasks)async def ping(self, ip):res = await asyncio.to_thread(self.ping_single, ip)status = "在线" if res == 0 else "掉线"self.result_signal.emit(ip, status)  # 发送IP和状态信号# 根据状态将IP添加到对应的列表if status == "在线":self.online_ips.append(ip)else:self.offline_ips.append(ip)self.pinged_ips += 1progress = int((self.pinged_ips / self.total_ips) * 100)  # 计算当前进度self.progress_signal.emit(progress)  # 发送进度信号def ping_single(self, ip):"""使用subprocess调用ping命令"""return subprocess.call(f'ping -n 1 -w 5 {ip}', stdout=subprocess.PIPE)def stop(self):self.stop_requested = True  # 设置停止标志class PingApp(QWidget):def __init__(self):super().__init__()self.setWindowTitle("IP网络扫描工具")self.setGeometry(200, 200, 800, 600)# 设置最小宽度为1064像素self.setMinimumWidth(1064)# 设置全局字体为Segoe UIfont = QFont("Segoe UI", 10)self.setFont(font)# UI控件self.layout = QVBoxLayout()self.status_label = QLabel("请输入待检测的网段列表 (例如:192.168.1, 192.168.2,支持多网段扫描,网段之间用英文','隔开)", self)self.layout.addWidget(self.status_label)self.input_field = QLineEdit(self)self.layout.addWidget(self.input_field)# 创建水平布局来放置开始、停止和导出按钮self.button_layout = QHBoxLayout()# 修改按钮背景色为淡蓝色self.start_button = QPushButton("开始扫描", self)self.start_button.setStyleSheet("background-color: lightblue;")self.start_button.clicked.connect(self.start_ping)self.button_layout.addWidget(self.start_button)self.stop_button = QPushButton("停止扫描", self)self.stop_button.setStyleSheet("background-color: lightblue;")self.stop_button.clicked.connect(self.stop_ping)self.stop_button.setEnabled(False)  # 初始时不可用self.button_layout.addWidget(self.stop_button)self.export_button = QPushButton("导出数据", self)self.export_button.setStyleSheet("background-color: lightblue;")self.export_button.clicked.connect(self.export_data)self.button_layout.addWidget(self.export_button)# 将按钮布局添加到主布局中self.layout.addLayout(self.button_layout)# 添加文本输出区域self.output_text = QTextEdit(self)self.layout.addWidget(self.output_text)# 设置最大高度来缩减文本显示区域的高度self.output_text.setMaximumHeight(200)  # 设置最大高度为200# 添加进度条self.progress_bar = QProgressBar(self)self.progress_bar.setRange(0, 100)self.layout.addWidget(self.progress_bar)# 添加表格self.table_widget = QTableWidget(self)self.layout.addWidget(self.table_widget)self.setLayout(self.layout)def start_ping(self):user_input = self.input_field.text().strip()if not user_input:self.output_text.append("输入无效,请输入网段列表!")return# 校验输入是否是有效的网段格式if not self.is_valid_ip_prefix(user_input):self.output_text.append("无效的网段格式,请确保输入的是有效网段")returnself.output_text.append(f"开始检测:{user_input}")self.start_button.setEnabled(False)self.stop_button.setEnabled(True)  # 启用停止按钮ip_queue = Queue()ip_prefixes = user_input.split(',')  # 支持多个网段total_ips = len(ip_prefixes) * 256  # 每个网段包含256个IP地址# 遍历多个网段并生成IP地址for prefix in ip_prefixes:prefix = prefix.strip()for i in range(256):ip = f"{prefix}.{i}"  # 生成每个网段对应的IPip_queue.put(ip)# 动态设置表格的行数和列数rows = (total_ips + 9) // 10  # 计算需要的行数,最多每行10个IPself.table_widget.setRowCount(rows)  # 设置表格的行数self.table_widget.setColumnCount(10)  # 每行10个IP# 填充表格ip_index = 0for prefix in ip_prefixes:  # 遍历每个网段prefix = prefix.strip()for i in range(256):if ip_index < total_ips:ip = f"{prefix}.{i}"  # 生成完整的IP地址row = ip_index // 10  # 计算行数col = ip_index % 10  # 计算列数self.table_widget.setItem(row, col, QTableWidgetItem(ip))  # 设置表格单元格的IPip_index += 1# 启动ping线程self.ping_thread = PingThread(ip_queue, total_ips)self.ping_thread.result_signal.connect(self.update_result)self.ping_thread.progress_signal.connect(self.update_progress)  # 连接进度更新信号self.ping_thread.finished.connect(self.on_ping_finished)self.ping_thread.start()def stop_ping(self):if self.ping_thread.isRunning():self.ping_thread.stop()  # 请求停止线程self.output_text.append("检测已停止")self.start_button.setEnabled(True)self.stop_button.setEnabled(False)  # 停止后禁用停止按钮def export_data(self):# 使用 QInputDialog.getItem() 来显示选择框export_type, ok = QInputDialog.getItem(self, "选择导出项", "选择导出数据项", ["在线IP", "掉线IP", "日志记录"], 0, False)if ok:if export_type == "在线IP":self.export_file("在线IP.txt")elif export_type == "掉线IP":self.export_file("掉线IP.txt")elif export_type == "日志记录":self.export_log()def export_file(self, file_name):# 弹出文件保存对话框,选择保存路径file_path, _ = QFileDialog.getSaveFileName(self, f"保存{file_name}", file_name, "文本文件 (*.txt)")if file_path:# 使用内存列表替代读取文件ip_list = self.get_ip_list(file_name)# 排序IP地址(从小到大)ip_list.sort(key=self.ip_to_tuple)# 写入排序后的文件,每个IP地址按行分开with open(file_path, 'w') as f:for ip in ip_list:f.write(f"{ip}\n")  # 每个IP地址后加上换行符QMessageBox.information(self, "导出成功", f"{file_name} 已成功导出到 {file_path}")def export_log(self):# 弹出文件保存对话框,选择保存日志路径file_path, _ = QFileDialog.getSaveFileName(self, "保存日志文件", "日志记录.txt", "文本文件 (*.txt)")if file_path:with open(file_path, 'w') as f:f.write(self.output_text.toPlainText())QMessageBox.information(self, "导出成功", f"日志记录已成功导出到 {file_path}")def get_ip_list(self, file_name):# 根据文件名从内存中获取相应的IP列表ip_list = []if file_name == "在线IP.txt":ip_list = self.ping_thread.online_ips  # 获取在线IP列表elif file_name == "掉线IP.txt":ip_list = self.ping_thread.offline_ips  # 获取掉线IP列表return ip_listdef ip_to_tuple(self, ip):# 将IP地址转换为元组,用于排序return tuple(map(int, ip.split('.')))def is_valid_ip_prefix(self, ip_prefix):# 简单的IP前缀校验(支持多个网段)parts = ip_prefix.split(',')if len(parts) < 1:return Falsefor part in parts:part = part.strip()if not self.is_valid_single_ip_prefix(part):return Falsereturn Truedef is_valid_single_ip_prefix(self, ip_prefix):# 校验单一网段是否有效(例如:192.168.1)parts = ip_prefix.split('.')if len(parts) != 3:return Falsefor part in parts:if not part.isdigit() or not 0 <= int(part) <= 255:return Falsereturn True  # 必须输入三个部分def update_result(self, ip, status):# 更新表格单元格的背景色for row in range(self.table_widget.rowCount()):for col in range(self.table_widget.columnCount()):item = self.table_widget.item(row, col)if item and item.text() == ip:if status == "在线":item.setBackground(QColor('green'))  # 使用QColor类else:item.setBackground(QColor('gray'))  # 使用QColor类# 在文本输出区域显示每个IP的状态self.output_text.append(f"{ip} - {status}")def update_progress(self, progress):self.progress_bar.setValue(progress)  # 更新进度条的值def on_ping_finished(self):# 计算在线和掉线主机数量online_count = len(self.ping_thread.online_ips)offline_count = len(self.ping_thread.offline_ips)# 显示检测完成信息和统计self.output_text.append(f"扫描完成!")self.output_text.append(f"在线主机数: {online_count}")self.output_text.append(f"掉线主机数: {offline_count}")self.start_button.setEnabled(True)self.stop_button.setEnabled(False)  # 禁用停止按钮# 弹出完成提示框QMessageBox.information(self, "提示", "扫描已完成!")if __name__ == "__main__":app = QApplication(sys.argv)window = PingApp()window.show()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6631.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…

利用 SAM2 模型探测卫星图像中的农田边界

将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 &#x1f31f; 简介 手动绘制田地边界是最耗时的任务之一&#xff0c;其准确性取决于绘制者的表现。然而&#xff0c;精确的边界检测在很多领域都有应用。例如&#xff0c;假设您…

初步搭建并使用Scrapy框架

目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用&#xff0c;本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步&#xff1a;在D:\pyt…

人脸识别打卡系统--基于QT(附源码)

逃离舒适区 项目源代码放在我的仓库中&#xff0c;有需要自取 项目地址 https://gitcode.com/hujiahangdewa/Face_recognition.git 文章目录 一、项目结构分析二、服务器的搭建三、客户端的搭建四、人脸识别库的申请五、基于人脸识别库的识别判断六、QT人脸识别----调用百度ai…

微信小程序中常见的 跳转方式 及其特点的表格总结(wx.navigateTo 适合需要返回上一页的场景)

文章目录 详细说明总结wx.navigateTo 的特点为什么 wx.navigateTo 最常用&#xff1f;其他跳转方式的使用频率总结 以下是微信小程序中常见的跳转方式及其特点的表格总结&#xff1a; 跳转方式API 方法特点适用场景wx.navigateTowx.navigateTo({ url: 路径 })保留当前页面&…

设计模式的艺术-享元模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解享元模式 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 在享元模式中&#xff0c;存储这些共享实例对象的地方称为享元池&…

20250122-正则表达式

1. 正则标记 表示一位字符&#xff1a;\\ 表示指定的一位字符&#xff1a;x 表示任意的一位字符&#xff1a;. 表示任意一位数字&#xff1a;\d 表示任意一位非数字&#xff1a;\D 表示任意一个字母&#xff1a;[a-zA-Z]&#xff08;大写或小写&#xff09; 表示任意一个…

OpenEuler学习笔记(八):安装OpenEuler

在VMware Workstation中安装OpenEuler 准备工作 下载并安装VMware Workstation虚拟机软件。前往OpenEuler官网下载OpenEuler系统镜像文件。 创建虚拟机 打开VMware Workstation&#xff0c;点击“创建新的虚拟机”&#xff0c;选择“自定义”&#xff0c;点击“下一步”。选择…

“““【运用 R 语言里的“predict”函数针对 Cox 模型展开新数据的预测以及推理。】“““

主题与背景 本文主要介绍了如何在R语言中使用predict函数对已拟合的Cox比例风险模型进行新数据的预测和推理。Cox模型是一种常用的生存分析方法&#xff0c;用于评估多个因素对事件发生时间的影响。文章通过具体的代码示例展示了如何使用predict函数的不同参数来获取生存概率和…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器&#xff1a;总告警次数&#xff1a;{{ServerTotal}} 服务器IP:{{IPA}}&#xff0c;总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}}&#xff0c;总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

使用github提交Pull Request的完整流程

文章目录 1.Fork仓库2. git clone 仓库在本地3.对项目进行修改开发4.上传项目到远程仓库操作补充1. git add .2. git commit -m "提交信息"3. git pull4. git push总结完整工作流程示例 5.将更新的项目pull Request给原来的仓库主人 当多人进行项目的开发的时候&…

浅谈Unity中Canvas的三种渲染模式

Overview UGUI通过 Canvas 组件渲染和管理UI元素。Canvas 是 UI 元素的容器&#xff0c;它决定了 UI 元素的渲染方式以及它们在屏幕上的显示效果。Canvas 有三种主要的渲染模式&#xff0c;每种模式有不同的用途和特点。本文将介绍这三种渲染模式 1. Screen Space - Overlay 模…

Kafak 单例生产者实现-C#操作

前面写了一篇入门操作的文章,因为工作需要,简单修改了下如何实现单例生产者。 Kafka入门-C#操作_c# kafka-CSDN博客文章浏览阅读1.6k次,点赞20次,收藏9次。2).报错:“kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state…

第五天 Labview数据记录(5.1 INI配置文件读写)

5.1 INI配置文件读写 INI配置文件是一种简单的文本文件&#xff0c;通常用于存储软件的配置信息。它具有以下作用&#xff1a; 存储软件配置参数方便软件的维护和更新提高软件的灵活性和可扩展性便于用户修改和共享配置 5.1.1 前面板 1&#xff09;新建项目SaveData_Exampl…

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

ElasticSearch(十一)— Elasticsearch中的SQL语句

一、总概 Elasticsearch 在 Basic 授权中支持以 SQL 语句的形式检索文档&#xff0c;SQL 语句在执行时会被翻译为 DSL 执行。从语法的角度来看&#xff0c;Elastisearch 中的 SQL 语句与RDBMS 中的 SQL 语句基本一致&#xff0c; 所以对于有数据库编程基础的人来说大大降低了使…

详解Redis的Zset类型及相关命令

目录 Zset简介 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZRANGEBYSCORE ZPOPMAX BZPOPMAX ZPOPMIN BZPOPMIN ZRANK ZREVRANK ZSCORE ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZINCRBY ZINTERSTORE 内部编码 应用场景 Zset简介 有序集合相对于字符串、列表、哈希…

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年&#xff0c;科技的浪潮汹涌澎湃&#xff0c;人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰&#xff0c;方便了大家的日常生活&#xff0c;也照亮了人类未来的道路。这一年&#xff0c;科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

09_异步加载_单例模式_常量类配置_不可销毁

1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…