PhanDat1996/tcp-port-checker
GitHub: PhanDat1996/tcp-port-checker
一款零依赖的快速多线程 TCP 端口扫描器,支持多主机批量扫描、banner 抓取与结果导出。
Stars: 0 | Forks: 0
# tcp-port-checker
一个快速、多线程的 TCP 端口扫描器,使用纯 Python 编写 —— 无任何外部依赖。
扫描一个或多个主机的单个端口、逗号分隔列表或范围。报告端口的 open/closed/timeout 状态及延迟,可选的 banner grabbing,并支持导出为 CSV/JSON。
## 功能
- **多主机、多端口** —— 在单条命令中扫描多个目标
- **灵活的端口语法** —— `22,80,443`、`1-1024` 或组合的 `22,80,8000-9000`
- **多线程** —— 默认 100 个并行连接(可通过 `-w` 配置)
- **Banner grabbing** —— 从开放端口读取前 1024 字节(`--banner`)
- **导出** —— CSV 和/或 JSON 输出
- **零依赖** —— 仅需 Python 3.8+ 标准库
## 要求
- Python 3.8+
- 无需 `pip install`
## 用法
```
python tcp_port_checker.py -H -p [options]
```
### 选项
| 标志 | 描述 | 默认值 |
|---|---|---|
| `-H`, `--hosts` | 逗号分隔的主机名或 IP | 必填 |
| `-p`, `--ports` | 端口列表或范围 | 必填 |
| `-t`, `--timeout SEC` | 连接超时时间(秒) | `3` |
| `-w`, `--workers N` | 并行线程数 | `100` |
| `--open-only` | 仅打印 OPEN 状态的端口 | 关 |
| `--banner` | 尝试在开放端口上获取 service banner | 关 |
| `--csv FILE` | 将结果导出为 CSV | — |
| `--json FILE` | 将结果导出为 JSON | — |
## 示例
### 检查单个主机上的常见端口
```
python tcp_port_checker.py -H 192.168.1.1 -p 22,80,443,8080
```
```
[OPEN ] 192.168.1.1:22 latency=1.23 ms
[OPEN ] 192.168.1.1:80 latency=0.98 ms
[CLOSED ] 192.168.1.1:443 error=Connection refused
[TIMEOUT ] 192.168.1.1:8080 error=Connection timed out
=== Summary ===
Total : 4
Open : 2
Closed : 1
Timeout : 1
```
### 扫描端口范围,仅显示开放端口
```
python tcp_port_checker.py -H 10.0.1.50 -p 1-1024 --open-only
```
### 同时扫描多个主机
```
python tcp_port_checker.py -H 10.0.1.10,10.0.1.20,10.0.1.30 -p 22,80,443
```
### 获取 banner 并导出为 JSON
```
python tcp_port_checker.py -H db01.internal -p 3306,5432,6379 --banner --json result.json
```
```
[
{
"host": "db01.internal",
"port": 5432,
"status": "OPEN",
"latency_ms": 2.41,
"banner": "",
"error": ""
}
]
```
### 使用短超时进行快速全范围扫描
```
python tcp_port_checker.py -H target.host -p 1-65535 -t 1 -w 500 --open-only
```
### 导出为 CSV 以用于报告
```
python tcp_port_checker.py -H 192.168.1.1 -p 22,80,443,3306,5432 --csv scan.csv
```
CSV 输出格式:
```
host,port,status,latency_ms,banner,error
192.168.1.1,22,OPEN,1.23,SSH-2.0-OpenSSH_8.9p1,
192.168.1.1,80,OPEN,0.98,,
192.168.1.1,443,CLOSED,,,Connection refused
```
## 状态值
| 状态 | 含义 |
|---|---|
| `OPEN` | TCP 连接成功建立 |
| `CLOSED` | 连接被拒绝 —— 该端口上没有程序监听 |
| `TIMEOUT` | 在超时时间窗口内未响应 |
| `DNS_ERROR` | 无法解析主机名 |
| `ERROR` | 其他操作系统级别的 socket 错误 |
## 注意事项
- 在进行大范围扫描(`1-65535`)时,请使用 `--open-only` 以避免输出信息过于杂乱
- `--banner` 会在每个开放端口上增加 1.5 秒的读取等待时间 —— 请配合较小的端口列表使用
- 在大范围扫描时使用较高的 `--workers` 可能会触发 IDS 警报 —— 请负责任地使用
- 仅扫描 TCP —— 不支持 UDP
- 仅扫描您拥有或具有明确测试权限的系统
## 许可证
MIT
标签:Banner抓取, JSON导出, Python, TCP扫描, TCP端口, 实时处理, 密码管理, 开源, 插件系统, 数据统计, 无后门, 服务器安全, 标准库, 端口扫描, 纯Python开发, 网络安全, 网络扫描器, 轻量级工具, 逆向工具, 隐私保护, 零依赖