loerayamil-star/escaner-puertos

GitHub: loerayamil-star/escaner-puertos

一个使用 Python、Tkinter 和 threading 构建的轻量级 TCP 端口扫描桌面工具,可在图形界面中实时显示端口开放状态及关联服务。

Stars: 0 | Forks: 0

# 端口扫描器 我的计算机工程项目集 #5 —— DevSecOps 路线。 这是一个用于扫描主机 TCP 端口的桌面工具,其图形界面使用 Tkinter 构建。它可以实时显示哪些端口处于开放状态、关联的服务以及扫描进度——并且不会导致窗口卡顿。 ## 开发动机 端口扫描是攻防安全领域的基础技术之一。从零开始构建它,而不仅仅是使用 `nmap`,迫使我深入理解了底层原理:TCP 连接是如何工作的、为什么在图形界面中需要使用线程,以及如何安全地在辅助线程与 UI 之间进行通信。 ## 技术栈 | 技术 | 用途 | |------------|-----| | Python 3 | 基础编程语言 | | Tkinter + ttk | 图形界面(窗口、Treeview、Progressbar) | | `socket` | 用于测试各个端口的 TCP 连接 | | `threading` | 在辅助线程中执行扫描,防止 UI 卡死 | ## 界面 - **输入字段:** 主机(默认值:`localhost`)、起始端口和结束端口 - **扫描按钮:** 在扫描期间会被禁用,以避免并发执行 - **进度条:** 实时显示扫描进度及百分比 - **结果表格(Treeview):** 包含三列 —— 端口 / 服务 / 状态 ``` ┌─────────────────────────────────────────┐ │ Host: [localhost ] │ │ Puerto Inicial: [1 ] Final: [1024] │ │ [ Iniciar escaneo ] │ │ ████████████░░░░░░░░ Escaneando... 61%│ │ │ │ Puerto │ Servicio │ Estado │ │ ───────────────────────────── │ │ 22 │ SSH │ Abierto │ │ 80 │ HTTP │ Abierto │ │ 443 │ HTTPS │ Abierto │ └─────────────────────────────────────────┘ ``` ## 如何运行 **环境要求:** Python 3.8 或更高版本。无需任何外部依赖。 ``` git clone https://github.com/loerayamil-star/escaner-puertos.git cd escaner-puertos python3 escaner_puertos.py ``` ## 我应用的技术概念 **`connect_ex()` vs `connect()`** 如果端口已关闭,`socket.connect()` 会抛出异常——对全部 1024 个端口使用 `try/except` 进行处理不仅低效而且代码冗长。如果连接成功,`connect_ex()` 会返回 `0`;如果失败,则返回错误代码,且不会中断执行流程。这样我们就可以简单地编写如下代码: ``` return socket.connect_ex((host, puerto)) == 0 ``` **使用 `daemon=True` 的 Threading** 辅助线程被标记为 daemon(守护线程),这样当用户关闭窗口时,它会自动终止,不会在系统中留下孤儿进程。 **使用 `root.after()` 进行线程间通信** Tkinter 不是线程安全的——辅助线程不能直接修改控件,否则会导致 UI 崩溃。正确的解决方案是使用 `root.after(0, lambda: ...)` 将更新任务排入主线程的队列中,该函数会在 Tkinter event loop 的下一个周期中执行。 ``` self.root.after(0, lambda: self.tabla.insert("", "end", values=(puerto, servicio, "Abierto"))) ``` ## 伦理使用声明 ## 未来的改进方向 - [ ] 将结果导出为 `.txt` 或 `.csv` - [ ] 除了 TCP 外,支持 UDP 扫描 - [ ] 服务版本检测(banner grabbing) - [ ] 使用多个并发线程进行扫描以提升速度 - [ ] 历史扫描记录 ## 关于本项目 本项目是作为自学 DevSecOps 路线的一部分而开发的。这是我第一次有意识地深入使用 `socket` 和 `threading`——我的目标是彻底理解其底层机制,而不仅仅是让工具能够运行起来。
标签:GUI, Python, Tkinter, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 网络编程, 隐私保护