yetidevworks/yscan
GitHub: yetidevworks/yscan
一款 TUI 优先的本地网络设备发现与端口扫描器,通过多协议并行探测实现局域网设备的实时可视化盘点。
Stars: 5 | Forks: 3
# YScan
```
_____.___. _________
\__ | |/ _____/ ____ _____ ____
/ | |\_____ \_/ ___\\__ \ / \
\____ |/ \ \___ / __ \| | \
/ ______/_______ /\___ >____ /___| /
\/ \/ \/ \/ \/
Network discovery made easy!
```

一款 TUI 优先的网络扫描器,通过 ARP、mDNS、SSDP 和主机名探测来发现本地网络上的设备。在一个实时、可排序、可搜索的仪表板中查看所有设备——并附带名称和标识。
**支持的平台:** macOS 和 Linux
## 功能
- **TUI 仪表板** — 包含所有已发现设备的交互式表格,支持实时更新
- **多协议发现** — ARP 扫描、mDNS 服务浏览、SSDP/UPnP、反向 DNS 以及 HTTP banner 检测
- **自动识别** — 解析主机名、制造商名称(通过 OUI)以及服务类型
- **主机名探测** — 通过反向 DNS 和 HTTP banner 探测未命名设备(可识别 Proxmox、TrueNAS、Pi-hole、UniFi 等)
- **端口扫描** — 随时对任何设备进行按需端口扫描,涵盖 29 个常用端口
- **排序与过滤** — 支持按任意列排序,并可跨 IP、名称、MAC 和制造商进行搜索
- **剪贴板支持** — 只需一键即可复制 IP 或 MAC 地址
- **8 种颜色主题** — Dark、Light、Dracula、Nord、One Dark、Monokai Pro、Tokyo Night、Synthwave — 按下 `t` 实时切换,您的选择会自动保存
- **Oneshot 模式** — 单次扫描并输出表格或 JSON 格式,方便编写脚本
- **定期重新扫描** — 以可配置的间隔进行持续的后台扫描
## 安装说明
### Homebrew(推荐)
```
brew install yetidevworks/yscan/yscan
```
### 通过 crates.io 安装
```
cargo install yscan
```
### 通过源码安装
```
git clone https://github.com/yetidevworks/yscan
cd yscan
cargo install --path .
```
### 预编译二进制文件
从 [GitHub Releases](https://github.com/yetidevworks/yscan/releases) 下载。
## 快速开始
```
# 打开 TUI 仪表板(推荐:使用 sudo 运行以进行 ARP 扫描)
sudo yscan
# 一次性扫描输出到 stdout
sudo yscan scan
# 用于脚本编写的 JSON 输出
sudo yscan scan --json
# 使用特定的网络接口
sudo yscan -i en0
# 以特定主题启动,或在 TUI 中按 't' 循环切换(自动保存)
yscan --theme tokyo-night
```
## TUI 仪表板
直接运行不带任何参数的 `yscan` 命令即可打开交互式仪表板:
```
┌─ YScan | 12 devices | 192.168.1.0/24 | elevated | ⠹ Scanning network... ───┐
│ │
│ IP Address Name MAC Address Manufacturer │
│ ───────────────────────────────────────────────────────────────────────── │
│ 192.168.1.1 router.local aa:bb:cc:dd:ee:ff Ubiquiti │
│▸ 192.168.1.10 NAS.local 11:22:33:44:55:66 Synology │
│ 192.168.1.20 Proxmox VE 77:88:99:aa:bb:cc Intel │
│ 192.168.1.30 Living Room TV dd:ee:ff:00:11:22 Samsung │
│ 192.168.1.45 pi-hole.local 33:44:55:66:77:88 Raspberry Pi │
│ 192.168.1.100 - 99:aa:bb:cc:dd:ee Apple │
│ │
├─ Activity ─────────────────────────────────────────────────────────────────┤
│ 10:30:15 Discovered router.local (192.168.1.1) │
│ 10:30:16 Discovered NAS.local (192.168.1.10) │
│ 10:30:17 Scan complete - 12 devices │
├────────────────────────────────────────────────────────────────────────────┤
│ [/]search [s]ort [p]ort scan [y]ank IP [a]ctivity [r]escan [?]help [q]uit │
└────────────────────────────────────────────────────────────────────────────┘
```
### 快捷键
| 按键 | 操作 |
|-----|--------|
| `j` / `k` / `↑` / `↓` | 浏览设备列表 |
| `g` / `G` | 跳转至首个 / 末个设备 |
| `PageUp` / `PageDown` | 按页滚动 |
| `Enter` | 打开设备详情视图 |
| `/` | 搜索 / 过滤设备 |
| `s` | 循环切换排序列 (IP → 名称 → MAC → 制造商 → 最后发现时间) |
| `S` | 切换排序方式 (升序 / 降序) |
| `p` | 对选中设备进行端口扫描 |
| `y` | 复制 IP 地址到剪贴板 |
| `Y` | 复制 MAC 地址到剪贴板 |
| `a` | 切换活动日志面板 |
| `t` | 循环切换颜色主题 (自动保存) |
| `r` | 触发手动重新扫描 |
| `?` | 显示帮助悬浮窗 |
| `q` / `Esc` | 退出 (或清除搜索过滤器) |
| `Ctrl+C` | 强制退出 |
| `Ctrl+Z` | 挂起到后台 (Unix) |
### 详情视图
在任意设备上按下 `Enter` 键即可查看完整详情,包括:
- IP 地址和 MAC 地址
- 主机名和 mDNS 名称
- 制造商(通过 IEEE OUI 数据库)
- 发现来源(ARP、mDNS、SSDP、DNS)
- 开放端口及其服务名称
- 首次发现和最后发现的时间戳
- 来自 mDNS/SSDP 的额外元数据
## 工作原理
YScan 并行使用多种发现协议,然后根据 IP 地址合并结果:
```
┌────────────────────────────────────────────────────────────────┐
│ Discovery Engine │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌───────────────────┐ │
│ │ ARP │ │ mDNS │ │ SSDP │ │ Hostname Probe │ │
│ │ sweep │ │ browse │ │ search │ │ (reverse DNS + │ │
│ │ │ │ │ │ │ │ HTTP banners) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────────┬──────────┘ │
│ │ │ │ │ │
│ └────────────┴────────────┴────────────────┘ │
│ │ │
│ Merge by IP address │
│ │ │
│ ┌───────▼───────┐ │
│ │ Device Map │ │
│ └───────┬───────┘ │
│ │ │
└────────────────────────────┼───────────────────────────────────┘
│
┌───────▼───────┐
│ TUI / CLI │
└───────────────┘
```
### 发现协议
| 协议 | 发现目标 | 需要 sudo? |
|----------|---------------|----------------|
| **ARP** | 子网上的所有设备 (IP + MAC + 通过 OUI 获取的制造商) | 是 (用于主动扫描) |
| **mDNS** | 发布服务的设备 (打印机、智能家居、NAS 等) | 否 |
| **SSDP** | UPnP 设备 (路由器、媒体服务器、智能电视) | 否 |
| **Hostname** | 未命名设备的反向 DNS 名称 + HTTP banner 识别 | 否 |
### 主机名探测
未被 mDNS 或 SSDP 发现的设备(如 Proxmox 服务器、裸机或网络设备)通常没有显示名称。YScan 会自动使用以下方式探测这些未命名的设备:
1. **反向 DNS (PTR 查找)** — 速度快,返回诸如 `pve.local` 或 `nas.home` 的主机名
2. **HTTP banner 检测** — 通过原始 HTTP 请求探测 80、8080、8006、443、8443 端口,并根据 `Server` header 和 `` 标签识别设备
已知的服务器特征将被映射为友好的名称:
| 服务器 Banner | 识别为 |
|---------------|---------------|
| `pve-api-daemon/3.0` | Proxmox VE |
| `TrueNAS` | TrueNAS |
| `Synology` | Synology DSM |
| `UniFi` | UniFi Controller |
| `Pi-hole` | Pi-hole |
| `Home Assistant` | Home Assistant |
| `OPNsense` / `pfSense` | OPNsense / pfSense |
## 配置
YScan 开箱即用,无需任何配置。您也可以选择创建配置文件来自定义其行为。
**配置文件位置:**
- macOS: `~/Library/Application Support/yscan/config.yaml`
- Linux: `~/.config/yscan/config.yaml`
```
# 网络接口(如果省略则自动检测)
network_interface: en0
# 自动重新扫描之间的间隔秒数(默认:30)
scan_interval: 30
# 每个扫描周期的超时时间(秒)(默认:10)
scan_timeout: 10
# 颜色主题:dark, light, dracula, nord, onedark, monokai-pro, tokyo-night, synthwave
theme: dark
# 切换各个扫描器
scanners:
arp: true
mdns: true
ssdp: true
# Port scanner 设置
port_scanner:
timeout_ms: 5000
ports:
- 22
- 80
- 443
- 8080
# ... add or remove ports as needed
```
### 默认端口
端口扫描器默认会检查以下 29 个端口:
`21` `22` `23` `25` `53` `80` `110` `135` `139` `143` `389` `443` `445` `993` `995` `1433` `1521` `3306` `3389` `5432` `5900` `8080` `8443` `9000` `9090` `9200` `9300` `10000` `27017`
## CLI 参考
```
yscan [OPTIONS] [COMMAND]
Commands:
scan One-shot scan, print results to stdout
demo Launch with synthetic demo data
Options:
-i, --interface Network interface (e.g., en0)
--theme Color theme [default: dark]
-h, --help Print help
-V, --version Print version
```
### 示例
```
# 交互式 TUI(默认)
sudo yscan
# 一次性扫描并输出表格
sudo yscan scan
# 用于通过管道传递给 jq、脚本等的 JSON 输出
sudo yscan scan --json
# 扫描特定接口
sudo yscan -i eth0
# 使用演示数据尝试 TUI(无需网络访问)
yscan demo
# Synthwave 主题
yscan --theme synthwave
```
## 许可证
Apache 2.0 License
标签:Maven构建, Rust, TUI, 云存储安全, 可视化界面, 插件系统, 数据统计, 端口扫描, 网络发现, 网络扫描, 网络流量审计, 运维工具, 通知系统