sarthakagrawal927/port-whisperer
GitHub: sarthakagrawal927/port-whisperer
一款用Rust编写的本地端口监控工具,能自动识别30多种开发框架并提供进程健康检查。
Stars: 0 | Forks: 0
# port-whisperer (Rust)
开发者友好的端口扫描工具,支持框架检测、Docker 感知和进程健康监控。
[LarsenCundric/port-whisperer](https://github.com/LarsenCundric/port-whisperer) 的 Rust 移植版 —— 单一静态二进制文件,零运行时依赖。
## 安装
单行命令(下载预编译二进制文件):
```
curl -fsSL https://raw.githubusercontent.com/sarthakagrawal927/port-whisperer/main/install.sh | sh
```
或使用 Cargo:
```
cargo install --git https://github.com/sarthakagrawal927/port-whisperer
```
或从源码构建:
```
git clone https://github.com/sarthakagrawal927/port-whisperer
cd port-whisperer
cargo install --path .
```
## 用法
```
ports Show dev server ports (filtered)
ports --all Show all listening ports
ports Inspect a specific port (+ interactive kill)
ports open Open localhost: in browser
ports free Kill whatever's on that port (SIGTERM → SIGKILL)
ports json JSON output for scripting
ports json --all JSON output including system ports
ports log Show port history
ports log History for a specific port
ports ps Show running dev processes sorted by CPU%
ports ps --all Show all processes
ports clean Find & kill orphaned/zombie dev processes
ports watch Monitor port changes in real-time
ports help Show help
```
## 示例
```
╭────────┬───────┬───────────┬───────────┬─────────┬─────────────┬────────╮
│ PORT ┆ PID ┆ PROCESS ┆ FRAMEWORK ┆ PROJECT ┆ HEALTH ┆ UPTIME │
╞════════╪═══════╪═══════════╪═══════════╪═════════╪═════════════╪════════╡
│ :3000 ┆ 12345 ┆ node ┆ Next.js ┆ my-app ┆ ● healthy ┆ 2h15m │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ :5432 ┆ 789 ┆ postgres ┆ PostgreSQL┆ ┆ ● healthy ┆ 5d3h │
╰────────┴───────┴───────────┴───────────┴─────────┴─────────────┴────────╯
```
## 功能特性
- **框架检测** —— 通过命令行检查、`package.json` 依赖和配置文件识别 Next.js、Vite、Express、Django、Rails、FastAPI 等 30 多种框架
- **Docker 感知** —— 将主机端口映射到容器名称和镜像
- **项目解析** —— 从进程 cwd 向上遍历以查找项目根目录(`package.json`、`Cargo.toml`、`go.mod` 等)
- **进程健康** —— 颜色编码:绿色(健康)、黄色(孤立)、红色(僵尸)。只有 PPID 为 1 的 dev server 才会被标记为孤立 —— daemon、应用程序和 Homebrew 服务会被正确分类为健康
- **智能过滤** —— 默认隐藏系统应用(Spotify、Chrome、Slack、Warp 等);`--all` 显示所有内容
- **优雅终止** —— 始终先尝试 SIGTERM,等待最多 2 秒,然后回退到 SIGKILL
- **快速释放** —— `ports free 3000` 终止占用该端口的进程,无需确认
- **浏览器打开** —— `ports open 3000` 在默认浏览器中打开 localhost
- **JSON 输出** —— `ports json` 用于脚本编写和管道传输至 `jq`;包含所有字段(端口、pid、框架、健康状况、内存、运行时间、命令、cwd、docker 信息)
- **端口历史** —— 每次 `ports` 扫描都会将带时间戳的快照记录到 `~/.ports-history/`;`ports log` 显示历史记录,`ports log ` 筛选特定端口
- **监视模式** —— 实时监控端口打开/关闭事件(每 2 秒轮询一次)
## 工作原理
三次批量 shell 调用,而非每个进程 N 次:
1. `lsof -iTCP -sTCP:LISTEN` —— 查找所有监听端口
2. `ps -p -o pid,ppid,stat,rss,lstart,command` —— 单次调用获取所有 PID
3. `lsof -a -d cwd -p ` —— 解析工作目录以进行项目检测
框架检测是分层的:首先检查已知的服务器进程,然后是命令行关键字,接着是 `package.json` 依赖、配置文件、Docker 镜像名称,最后回退到进程名称。
## 测试
```
cargo test
```
57 个测试:36 个单元测试(etime 解析、系统应用检测、孤立分类、框架检测、JSON 输出、日志过滤)+ 21 个覆盖所有命令和边缘情况的集成测试。
## 限制
- **仅限 macOS** —— `lsof` 和 `ps` 标志是 darwin 特有的。Linux 支持需要不同的解析方式。
- **进程名称被截断** —— `lsof` 将名称限制在约 9 个字符(例如 `redis-server` 显示为 `redis-ser`)。检测仍然有效,但显示被截断。
- **框架检测是启发式的** —— 它分层使用命令行关键字、`package.json` 依赖、配置文件和 Docker 镜像。边缘情况会回退显示原始进程名称。
- **孤立检测是保守的** —— 只有具有 PPID 1 的开发类进程(node、python、cargo 等)才会被标记。它会遗漏不常见的运行时,但这比误杀你的终端要好。
## 路线图
- **`ports group`** —— 按项目对端口进行分组(一个应用通常占用多个端口:dev server、HMR、API)
- **Linux 支持** —— 调整 `lsof`/`ps` 解析以适应 Linux 标志和 `/proc` 文件系统
## 致谢
- 原作:[LarsenCundric/port-whisperer](https://github.com/LarsenCundric/port-whisperer) (Node.js)
- Rust 移植版由 [Claude Code](https://claude.ai/claude-code) (Anthropic) 编写
## 许可证
MIT
标签:Awesome, CLI, Docker, Rust, SOC Prime, URL短链接分析, WiFi技术, WSL, 可视化界面, 安全防御评估, 开发工具, 开发者友好, 插件系统, 数字取证, 数据统计, 服务探测, 框架识别, 端口扫描, 端口管理, 系统管理, 网络工具, 网络流量审计, 自动化脚本, 请求拦截, 进程健康检查, 通知系统, 静态二进制