Ha-Raouf/python-port-scanner
GitHub: Ha-Raouf/python-port-scanner
一个多线程 TCP 端口扫描器,支持 Banner 抓取、服务检测与 CSV/JSON 报告导出,帮助用户在教育及授权场景下快速发现开放端口。
Stars: 0 | Forks: 0
# Python 端口扫描器
一个使用 Python 构建的快速、多线程 TCP 端口扫描器,具备 banner 抓取、
服务检测、彩色输出、实时进度条以及 CSV/JSON 报告
导出功能。
本项目作为一个学习项目,旨在帮助理解网络基础知识(socket、
TCP 连接、并发),并开发出一个实用、可复用
的侦察工具。
## 功能
- **多线程扫描** — 使用 `ThreadPoolExecutor` 并发扫描数百个端口,而不是逐个扫描
- **Banner 抓取** — 在可用时,从开放端口读取服务 banner(例如 `SSH-2.0-OpenSSH_8.9`)
- **服务检测** — 即使没有 banner,也能将知名端口映射到服务名(HTTP、SSH、FTP、MySQL、RDP 等)
- **CLI 接口** — 可配置目标、端口范围、线程数和超时时间,无需修改代码
- **彩色输出** — 突出显示开放端口以提高可读性
- **进度条** — 通过 `tqdm` 显示实时扫描进度
- **报告导出** — 将结果保存为带时间戳的 CSV 和/或 JSON 文件
- **输入验证** — 无效的目标或端口范围将显示清晰的错误信息,而不是直接崩溃
## 项目结构
```
port-scanner/
├── scanner.py # Main entry point / CLI
├── banner.py # Banner grabbing logic
├── common_ports.py # Port -> service name lookup table
├── report.py # CSV / JSON export
├── utils.py # Input validation + colored output helpers
├── requirements.txt
└── reports/ # Scan output files (created automatically)
```
## 安装
```
git clone https://github.com//port-scanner.git
cd port-scanner
pip install -r requirements.txt
```
## 使用方法
```
python scanner.py --target --ports [options]
```
### 示例
扫描本机的前 1024 个端口:
```
python scanner.py --target 127.0.0.1 --ports 1-1024
```
扫描指定的单个端口:
```
python scanner.py --target 127.0.0.1 --ports 22
```
扫描远程练习目标(Nmap 的创建者明确允许对其进行公开扫描),使用更多线程并输出 JSON:
```
python scanner.py --target scanme.nmap.org --ports 1-1000 --threads 200 --format json
```
### CLI 选项
| 标志 | 描述 | 默认值 |
|---------------|---------------------------------------------------|---------|
| `--target` | 目标 IP 地址或主机名 | 必填 |
| `--ports` | 端口范围 (`1-1024`) 或单个端口 (`80`) | 必填 |
| `--threads` | 并发线程数 | 100 |
| `--timeout` | Socket 超时时间(秒) | 1.0 |
| `--format` | 报告格式:`csv`、`json`、`both` 或 `none` | csv |
## 示例输出
```
============================================================
Python Port Scanner
============================================================
Target : scanme.nmap.org (45.33.32.156)
Port range : 1-1000
============================================================
Scanning: 100%|████████████████████| 1000/1000 [00:04<00:00, 224.31port/s]
[OPEN] Port 22 | SSH | SSH-2.0-OpenSSH_6.6.1p1
[OPEN] Port 80 | HTTP | No banner received
============================================================
Scan complete: 2 open port(s) found in 4.46s
============================================================
[+] CSV report saved to: reports/scan_scanme.nmap.org_20260723_101530.csv
```
## 工作原理
1. 将目标主机名解析为 IP 地址。
2. 将端口范围分配给一个工作线程池。
3. 每个线程尝试对其分配的端口发起 TCP 连接 (`connect_ex`)。
4. 如果连接成功,扫描器会尝试读取 banner,并
查找该端口的已知服务名。
5. 进度条会实时打印结果,随后将其导出到磁盘。
## 法律与道德使用声明
本工具仅供教育目的及经授权的安全测试使用。
请仅扫描您拥有或获得明确书面测试权限的系统。
未经授权的端口扫描在您所在的司法管辖区可能属于违法行为。本
README
中的示例使用了 `scanme.nmap.org`,这是 Nmap 的创建者
明确提供用于公开扫描练习的主机。
## 未来的改进方向
- 支持 UDP 扫描
- 使用 Async I/O (`asyncio`) 代替线程以实现更快的扫描
- 集成 Nmap,以便对发现的端口进行更深入的后续扫描
- 基于 Web 的结果仪表板
## 许可证
MIT
标签:Python, 域名侦查, 插件系统, 数据统计, 无后门, 端口扫描, 逆向工具