侦测终端里的「幽灵纸条」——端口还在纸上,房间已经空了。
你电脑里有些程序(比如 Clash)关闭后,会在环境变量里留下一张「纸条」指向一个已经不存在的端口。其他程序拿着纸条去找,发现没人,就报错。GhostWall 帮你一眼找出这些过期纸条。
- macOS(Linux 也支持,但标签可能显示为
bash) - Python 3(macOS 自带)
- 零第三方依赖,不装任何东西
# 1. 进目录
cd GhostWall
# 2. 加可执行权限(首次)
chmod +x ghostwall在系统 Terminal 里执行一次,以后就能在任何地方敲 ghostwall 启动:
echo "alias ghostwall='python3 /完整路径/GhostWall/ghostwall'" >> ~/.zshrc && source ~/.zshrc把 /完整路径/GhostWall/ghostwall 换成你放这个文件的实际路径。
./ghostwall
# 或者设了 alias 之后直接
ghostwall| 你想做的事 | 怎么做 |
|---|---|
| 上下翻看 | 键盘 ↑ ↓ 或鼠标滚轮 |
| 翻页 | PageUp / PageDown |
| 看某一行的详细信息 | Enter 或鼠标点击那一行 |
| 关闭详情弹窗 | Enter 或 点空白处 |
| 重新扫描(比如刚改了环境变量) | R |
| 退出 | Q |
┌─ GhostWall · 鬼打墙 ──── [R]刷新 [↑↓]浏览 [Enter]详情 [Q]退出 ─┐
│ │
│ Shell PID 变量 端口 状态 │
│ ────────────────────────────────────────────────────── │
│▸ iTerm 42341 HTTP_PROXY 7890 🟢 活着 │
│ Obsidian 43102 HTTP_PROXY 55632 🔴 已死 ← 红底 │
│ VS Code 44001 (无纸条) - ⚪ 无端口 │
│ │
│ 1 个鬼打墙 共 3 条记录 │
│ 红色行 = 鬼打墙 · 纸条指向空房间 · unset 即可破除 │
└───────────────────────────────────────────────────────────────────┘
| 看到这个 | 意思 | 需要管吗 |
|---|---|---|
| 🟢 活着 / 绿底行 | 端口有人,纸条有效 | 不用管 |
| 🔴 已死 / 红底行 | 鬼打墙! 纸条指向空房间 | |
| ⚪ 无端口 | 这个 Shell 没有纸条 | 不用管 |
点那一行按 Enter,弹窗会显示精确的修复命令,比如:
unset HTTP_PROXY
复制那条命令,在对应的 Terminal 窗口里粘贴执行就行。
如果你懒得一个个修,想一键清空所有纸条:
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxyexport 设置。
GhostWall 做了三件事:
- 找终端进程 — 用
ps找到所有运行中 zsh/bash 的 PID - 读纸条 — 用
ps eww -p <PID>读取每个进程的环境变量,找出带proxy字样的(即「纸条」) - 敲门 — 从纸条里抠出端口号,用
lsof -i :<端口>看端口背后有没有程序在听
三步全用系统自带命令,不装任何东西,不联网。
Q: 打开后一片空白?
A: 当前没有运行任何 zsh/bash 终端。打开一个 Terminal 窗口再试。
Q: 红底行太多,哪个是我的问题?
A: 找你当前在用的那个标签(比如 iTerm 或 Obsidian),看它下面的红底行。别的 Shell 的纸条跟你无关。
Q: 端口是什么,完全不懂?
A: 不需要懂。就当它是快递柜的格子编号。有人 = 程序还在。没人 = 鬼打墙。
作者在两天内先后撞上了 GrokBuild CLI 和 CodeWhale API 的网络连接故障。排查到底,发现都是同一个原因:之前设置的端口已经关了,但环境变量里指向那个端口的「纸条」还留着。程序拿着纸条去敲门,没人应,报错。
于是我写了一个工具,让它替我去敲门。