anjomozda/PortScanner
GitHub: anjomozda/PortScanner
一个使用 Python 标准库编写的零依赖 TCP 端口扫描器,通过多线程并行扫描快速探测目标主机开放端口并抓取服务 Banner。
Stars: 0 | Forks: 0
# 端口扫描器
一个使用 Python 编写的简单、无依赖的 TCP 端口扫描器。它通过普通的 TCP 连接扫描 (`socket.connect_ex`) 来扫描主机并报告哪些端口是开放的 —— 因此**不需要管理员/root 权限**。
## 功能
- 灵活的端口语法:范围 (`1-1024`)、列表 (`22,80,443`) 或混合形式 (`22,80,1000-1010`)
- 使用可配置线程池进行并行扫描以提高速度
- 每个端口扫描完成后立即输出结果 (`as_completed`)
- 为开放端口提供已知服务名称查找(例如 `22 → ssh`)
- **Banner 抓取**:从开放端口读取简短的标识 banner(例如 SSH 版本、HTTP `Server` 标头)
- **色彩丰富的终端 UI**:带有颜色渐变的 ASCII 艺术徽标、带有旋转指示器的实时进度条,以及简洁的结果表格(在通过管道重定向输出到文件,或使用 `--no-color` / `--no-logo` 时会自动禁用)
- 带有清晰错误处理的主机名解析
- 优雅地处理 Ctrl+C 中断
- 仅使用标准库 —— 无需额外安装任何内容
## 环境要求
- Python 3.7+
无需任何第三方包。可在 **Linux、macOS 和 Windows** 上运行(仅使用标准库)。
## 使用方法
```
python scanner.py [options]
```
### 选项
| 选项 | 描述 | 默认值 |
| --- | --- | --- |
| `host` | 目标 IP 地址或域名(位置参数) | — |
| `-p`, `--ports` | 要扫描的端口:`1-1024`、`22,80,443` 或混合形式 | `1-1024` |
| `-t`, `--timeout` | 每个端口的超时时间,以秒为单位 | `0.5` |
| `-w`, `--workers` | 并行线程数 | `100` |
| `--no-banner` | 跳过开放端口的 banner 抓取 | 默认开启 banner 抓取 |
| `--no-color` | 禁用彩色输出 | 默认开启颜色(如果在终端中) |
| `--no-logo` | 隐藏 ASCII 艺术徽标 | 默认显示徽标 |
### 示例
```
# 扫描 localhost 的前 1024 个端口
python scanner.py 127.0.0.1 -p 1-1024
# 扫描 router 上的特定端口
python scanner.py 192.168.1.1 -p 22,80,443
# 以 1s 超时扫描 nmap 测试服务器上的一个范围
python scanner.py scanme.nmap.org -p 20-100 -t 1.0
```
### 输出示例
在真实的终端中,徽标带有青色→蓝色渐变,开放端口显示为绿色,并且进度条带有旋转动画;以下是纯文本形式的展示效果:
```
____ __ _____
/ __ \____ _____/ /_/ ___/_________ _____ ____ ___ _____
/ /_/ / __ \/ ___/ __/\__ \/ ___/ __ `/ __ \/ __ \/ _ \/ ___/
/ ____/ /_/ / / / /_ ___/ / /__/ /_/ / / / / / / / __/ /
/_/ \____/_/ \__//____/\___/\__,_/_/ /_/_/ /_/\___/_/
by @anjomozda
Target scanme.nmap.org (45.33.32.156)
Scan 81 ports · 2.0s timeout · 100 threads
PORT SERVICE BANNER
────────────────────────────────────────────────────────────────
● 22/tcp ssh SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
● 80/tcp http HTTP/1.1 200 OK
✓ 2 open out of 81 scanned · 1.2s
```
使用 `--no-banner` 可跳过 banner 探测(速度更快,并且避免向开放端口发送任何数据),使用 `--no-color` 进行纯文本输出,或使用 `--no-logo` 来隐藏徽标。
## ⚠️ 法律声明
仅扫描您自己的机器、您自己的网络,或**明确**允许扫描的服务器(例如 [scanme.nmap.org](http://scanme.nmap.org))。未经许可扫描您不拥有的系统在您所在的司法管辖区可能是违法的。请负责任地使用。
## 工作原理
扫描器使用 `socket.connect_ex` 尝试与每个端口建立 TCP 连接,当连接成功(端口开放)时该函数会返回 `0`,而不是抛出异常。端口通过 `ThreadPoolExecutor` 进行并发扫描,对于每个开放端口,会使用 `socket.getservbyport` 查找对应的服务名称。
标签:服务器安全, 逆向工具