一步步教你用 Python 构建一个网络扫描工具,快速识别网络中的设备

开发 网络
今天将介绍如何用Python创建一个简易的图形界面网络扫描器,该工具结合了ping命令、nmap扫描以及ARP协议,用于扫描目标IP,收集如MAC地址和操作系统类型等信息。

在网络运维和安全中,网络扫描工具能帮助管理员快速发现网络问题、检测设备连通性和安全漏洞。今天将介绍如何用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:通过线程池执行并发任务,提高扫描效率。

三、代码实现

1. 初始化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')

2. 验证输入和生成扫描目标

我们添加了输入验证功能,确保用户输入的是有效的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):
        returnTrue
    messagebox.showerror("错误", "无效的IP地址格式!")
    returnFalse

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 []

3. 开始扫描

点击开始扫描按钮后,我们创建一个新的线程来执行扫描任务,避免阻塞主线程。扫描过程中,程序会启动进度条,提示用户扫描进度:

def start_scan(self):
    """启动扫描线程"""
    target = self.ip_entry.get().strip()
    ifnot 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,),
        daemnotallow=True
    )
    scan_thread.start()

4. 执行单个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

5. 扫描完成

当扫描完成后,我们停止进度条,并显示完成信息:

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可执行文件的步骤。

1. 安装PyInstaller

首先,确保你已安装了PyInstaller。你可以通过pip来安装:

pip install pyinstaller

2. 打包Python脚本

假设你的Python脚本名为network_scanner.py,你可以通过以下命令将其打包成.exe文件:

pyinstaller --onefile network_scanner.py
  • --onefile:表示将所有内容打包成一个单独的.exe文件。
  • network_scanner.py:是你的Python脚本文件。

如果你不使用--onefile,PyInstaller会创建一个文件夹,其中包含多个文件和依赖库,而不是一个单独的可执行文件。

3. 生成的可执行文件

在打包完成后,你可以在当前目录下找到一个dist文件夹,里面会包含你打包的network_scanner.exe文件。

  • 默认情况下,打包后的文件位于 dist/ 文件夹下。
  • 你可以在dist文件夹中找到生成的.exe文件。

双击运行.exe文件即可进行局域网扫描,如下图所示:

五、总结

通过本项目,我们成功地创建了一个基于Python的网络扫描器,具备扫描单个IP、IP网段、获取MAC地址、操作系统信息等功能。利用Tkinter打造了简洁的GUI界面,借助多线程技术提高了扫描效率,进度条的加入则大大改善了用户体验。

责任编辑:赵宁宁 来源: 攻城狮成长日记
相关推荐

2011-09-05 12:36:08

路由器限速linux路由器

2017-01-19 21:08:33

iOS路由构建

2017-12-25 11:50:57

LinuxArch Linux

2023-12-20 18:06:33

STOMP协议ActiveMQ

2018-06-11 15:30:12

2024-10-30 16:01:31

2019-04-01 10:15:02

2019-03-05 14:09:27

Docker存储容器

2019-07-09 15:23:22

Docker存储驱动

2018-12-24 10:04:06

Docker存储驱动

2021-07-05 10:33:55

开发技能Go

2010-08-10 11:31:36

路由器配置NAT

2009-04-15 09:29:07

2023-12-26 07:59:01

2009-08-14 11:35:01

Scala Actor

2010-08-12 10:02:16

路由器NAT

2018-04-23 14:23:12

2010-03-04 16:28:17

Android核心代码

2016-11-02 18:54:01

javascript

2024-09-30 09:56:59

点赞
收藏

51CTO技术栈公众号