一步步教你用Python构建一个网络扫描工具,快速识别网络中的设备
在网络运维和安全中,网络扫描工具能帮助管理员快速发现网络问题、检测设备连通性和安全漏洞。今天将介绍如何用Python
创建一个简易的图形界面网络扫描器,该工具结合了ping
命令、nmap扫描以及ARP
协议,用于扫描目标IP
,收集如MAC
地址和操作系统类型等信息。
之前我们已经分享过一篇关于如何使用Python
脚本扫描局域网IP并获取在线设备MAC地址的文章。为了让大家日后使用起来更加方便,这次我们将这个脚本通过Python
的第三方库Tkinter
封装成了一个简单易用的小软件。
🌈项目概述
本项目创建了一个图形化界面的网络扫描工具,用户可以输入目标IP
或网段,点击开始扫描按钮,程序会自动扫描指定的IP
地址,检测哪些主机在线,并展示其MAC
地址和操作系统信息。工具使用了Python
中的tkinter
库创建GUI
界面,并通过多线程提高扫描效率。
🌈关键模块与库
tkinter
:用于创建图形界面,包括文本框、按钮、标签、进度条等控件。subprocess
:用于执行系统命令(如ping
、arp
、nmap
),并获取命令的输出。re
:用于正则表达式匹配,提取IP
地址、MAC
地址和操作系统信息。concurrent.futures
:通过线程池执行并发任务,提高扫描效率。
🌈代码实现
📌初始化GUI界面
首先,我们通过tkinter
创建一个窗口,窗口中包括输入框、按钮和一个表格来显示扫描结果:
class NetworkScannerGUI:
def __init__(self, master):
self.master = master
master.title("网络扫描器 v1.0")
# 创建输入区域
input_frame = ttk.Frame(master, padding="10")
input_frame.pack(fill=tk.X)
ttk.Label(input_frame, text="目标IP/网段:").grid(row=0, column=0, sticky=tk.W)
self.ip_entry = ttk.Entry(input_frame, width=25)
self.ip_entry.grid(row=0, column=1, padx=5)
self.scan_button = ttk.Button(input_frame, text="开始扫描", command=self.start_scan)
self.scan_button.grid(row=0, column=2, padx=5)
# 新增提示标签
ttk.Label(input_frame, text="输入示例:192.168.1.100(单个IP)或 192.168.1(网段)",
foreground="gray").grid(row=1, column=0, columnspan=3, pady=5, sticky=tk.W)
# 创建结果显示表格
self.result_tree = ttk.Treeview(master, columns=('IP', 'MAC', '平台'), show='headings')
self.result_tree.heading('IP', text='IP地址')
self.result_tree.heading('MAC', text='MAC地址')
self.result_tree.heading('平台', text='操作系统')
self.result_tree.pack(expand=True, fill=tk.BOTH, padx=10, pady=5)
# 进度条
self.progress = ttk.Progressbar(master, mode='indeterminate')
📌验证输入和生成扫描目标
我们添加了输入验证功能,确保用户输入的是有效的IP
或网段格式,并根据输入生成需要扫描的IP地址列表:
def validate_input(self, ip_str):
"""验证输入的IP格式"""
if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}(\.\d{1,3})?$", ip_str):
return True
messagebox.showerror("错误", "无效的IP地址格式!")
return False
def generate_targets(self, ip_str):
"""生成要扫描的目标列表"""
if ip_str.count('.') == 3: # 单个IP
return [ip_str]
# 添加网段格式验证
if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}$", ip_str):
return generate_ip_range(ip_str)
messagebox.showerror("错误", "无效的网段格式!")
return []
📌开始扫描
点击开始扫描按钮后,我们创建一个新的线程来执行扫描任务,避免阻塞主线程。扫描过程中,程序会启动进度条,提示用户扫描进度:
def start_scan(self):
"""启动扫描线程"""
target = self.ip_entry.get().strip()
if not self.validate_input(target):
return
self.scan_button.config(state=tk.DISABLED)
self.progress.pack(fill=tk.X, padx=10)
self.progress.start()
self.result_tree.delete(*self.result_tree.get_children())
# 创建扫描线程
scan_thread = threading.Thread(
target=self.run_scan,
args=(target,),
daemon=True
)
scan_thread.start()
📌执行单个IP的扫描
通过ping
命令检查IP是否在线,如果在线,再通过arp
获取MAC地址,并通过nmap
获取操作系统信息:
def scan_single_ip(ip):
if ping_ip(ip):
mac = get_mac(ip)
platform_info = get_platform(ip)
return {"ip": ip, "mac": mac, "platform": platform_info}
return None
📌扫描完成
当扫描完成后,我们停止进度条,并显示完成信息:
def scan_complete(self):
"""扫描完成处理"""
self.progress.stop()
self.progress.pack_forget()
self.scan_button.config(state=tk.NORMAL)
messagebox.showinfo("完成", "扫描任务已完成!")
🌈打包exe软件包
将Python
脚本打包成.exe
可执行文件,可以使用多种工具,其中最常用的工具是PyInstaller
。下面是使用PyInstaller
将Python
脚本打包成Windows
可执行文件的步骤。
📌安装PyInstaller
首先,确保你已安装了PyInstaller
。你可以通过pip
来安装:
pip install pyinstaller
📌打包Python脚本
假设你的Python
脚本名为network_scanner.py
,你可以通过以下命令将其打包成.exe
文件:
pyinstaller --onefile network_scanner.py
--onefile
:表示将所有内容打包成一个单独的.exe
文件。network_scanner.py
:是你的Python
脚本文件。
如果你不使用--onefile
,PyInstaller
会创建一个文件夹,其中包含多个文件和依赖库,而不是一个单独的可执行文件。
📌生成的可执行文件
在打包完成后,你可以在当前目录下找到一个dist
文件夹,里面会包含你打包的network_scanner.exe
文件。
- 默认情况下,打包后的文件位于
dist/
文件夹下。 - 你可以在
dist
文件夹中找到生成的.exe
文件。
双击运行.exe
文件即可进行局域网扫描,如下图所示:
🌈总结
通过本项目,我们成功地创建了一个基于Python的网络扫描器,具备扫描单个IP
、IP
网段、获取MAC
地址、操作系统信息等功能。利用Tkinter
打造了简洁的GUI
界面,借助多线程技术提高了扫描效率,进度条的加入则大大改善了用户体验。
推荐阅读
- 如何在成百上千台服务器上轻松部署时间同步服务?只需这份Playbook!
- 如何用Ansible自动化收集和管理服务器日志?你需要这份Playbook!
- 让网络管理更高效!快速扫描局域网,实时获取IP与MAC地址
- 服务器卡顿?这张Linux性能调优全景图帮你找出真凶
- 90%的人都不会用DeepSeek?新手必看的正确姿势!
- Linux终端神器 Screen,让你的会话永不掉线