前言¶
在智能体或本地开发环境里排查「哪段代码在访问外网」,常见做法是临时开抓包、翻系统监视器,或者在终端里反复跑 lsof -i。DeepSeek Harness(DSH)把能力做成插件生态;若你希望不改动网络、只读地汇总套接字,并在界面与 Agent 工具里复用同一份快照,dsh-net-hosts 针对的就是这件事。下面按定位、能力、安装与限制说明用法。
这是什么¶
dsh-net-hosts 是 DSH 插件,维护者 Arthas1in,仓库 Arthas1in/dsh-net-hosts。它把 lsof -i 的套接字表整理成两件事:可随时打开的实时面板,以及给 Agent 调用的 net_connections 工具。插件全程只读——不建立连接、不修改配置、不向外部发送数据。
核心功能¶
实时面板(多视图)¶
面板入口在 DSH 左侧栏「上下文洞察」下的「网络连接」;默认是「软件」视图,直接对应「这台机器上哪个软件在连哪些域名」。
- 软件:每个 App 一行,列出域名与真实目的 IP(经本地代理的连接会还原域名并高亮);含连接数、域名数、最近活动(秒级)、所在网络。Chrome / Electron / 钉钉等会把 helper 进程归并回宿主 App;无法归并的标为「系统组件」。展开行可看各 host 首次/末次出现时间,以及「查看全部连接」。
- 时间线:只记录新出现的连接(秒级);启动后首份快照作基线,最多保留 400 条;点条目可跳到连接明细。
- 关注:可对 App 标星;出现新域名时面板提示(授权后也可发系统通知)。
- 连接明细:每条 TCP/UDP 一行,含状态、进程/PID、本地 → 远端、主机名;代理连接显示真实目标与「代理」徽标,按
pid + 四元组去重。 - 域名·IP:按对端聚合,适合回答「整机在和谁通信」;代理连接按域名聚合。
- 监听端口:仅 LISTEN 状态,便于查占端口进程。
通用能力包括:搜索、按公网/局域网/本机筛选、TCP/UDP 筛选、表头排序、展开行、一键复制地址;2 秒自动刷新(页面隐藏时暂停,可手动暂停/刷新)。无侧边栏入口时可用悬浮胶囊或快捷键打开(macOS 为 ⌘⇧N,Windows/Linux 为 Ctrl+Shift+N)。界面用 Shadow DOM 隔离,亮色/暗色跟随系统。
Agent 工具 net_connections¶
插件将同一份数据注册为 net_connections,参数如下:
| 参数 | 类型 | 说明 |
|---|---|---|
state |
string | all(默认)/ established / listening |
scope |
string | all(默认)/ public / lan / loopback |
limit |
number | 默认 40,上限 200 |
返回文本表:状态 进程(PID) 协议 本地 -> 远端 主机名。注册失败只写 debug 日志,面板仍可用。
只读 HTTP 接口¶
同源 GET:
| 路径 | 说明 |
|---|---|
/net-hosts/ |
独立页面 |
/net-hosts/api/snapshot |
快照 JSON;?fresh=1 跳过 700ms 复用 |
/net-hosts/api/health |
{ ok, name, version } |
也可访问 http://127.0.0.1:<dsh 端口>/net-hosts/。鉴权 fail-closed:Host 须为回环或可信主机列表(DSH_NET_HOSTS_TRUSTED_HOSTS / DSHW_TRUSTED_HOSTS),拒绝跨站 Sec-Fetch-Site 等。
本地代理下的真实域名¶
开着系统代理时,lsof 往往只能看到 127.0.0.1:7897 这类本地端口。插件会尝试读 Clash 系内核的 HTTP 控制接口,用 metadata.sourcePort 与本地端口配对,把连接还原为真实域名与 IP。发现顺序包括环境变量 DSH_NET_HOSTS_PROXY_URL / DSH_NET_HOSTS_PROXY_SOCKET、常见客户端配置、Verge 服务 socket、以及端口 9097 / 9090 / 9091 / 6170 等;控制接口不可达时静默降级,不影响 lsof 主流程。
安装与启用¶
环境要求(见 README):DSH >= 0.2.0,macOS(依赖系统自带 lsof);package.json 中 Node >= 20,当前包版本 0.5.2,许可证 MIT。
本地开发安装(link):
dsh plugin --profile web add link:~/dsh-plugins/dsh-net-hosts
若使用 desktop profile,需把包加入 ~/.dsh/profiles/desktop/package.json 的 dependencies,将 dsh-net-hosts 追加到 dsh.profile.bundles,并在 profile 的 node_modules 中建立指向源码目录的软链接,重启 DSH 后生效。
安装后左侧栏应出现「网络连接」;老版本或 web 版可能出现左下角「网络」胶囊(徽标为已建立连接数)。改 ui.js 后页面 ⌘R / Ctrl+R 即可;改 lib/collect.js 等宿主层需完全退出并重启 DSH。
社区目录页:skillhub.cn/plugins/Arthas1in/dsh-net-hosts。README 说明上架 npm 并提交 awesome-dsh-plugin 列表后可从市场一键安装,具体见仓库 PUBLISH.md;本文安装命令仅以 README 给出的 link 示例为准,勿自行拼接未在文档出现的 dsh plugin add 形式。
典型用法¶
- 人肉排查:打开「软件」视图,按最近活动排序,展开可疑 App 看 host 首次/末次时间;需要「刚才一秒谁连了什么」切到「时间线」。
- 占端口:打开「监听端口」,对照进程名与 PID。
- Agent 查询:在 DSH 对话中让模型调用
net_connections,例如限制state: established、scope: public、limit: 80,快速拿到文本摘要。 - 代理环境:确认 Clash / mihomo 控制面可达或设置
DSH_NET_HOSTS_PROXY_URL;在连接明细里看带「代理」徽标的行与展开后的规则链路。 - 开发调试:仓库根目录执行
npm test(node --test test/*.test.js)验证数据层。
适用场景与注意¶
适合:在本机(尤其 macOS)上做联调、隐私自查、端口冲突排查,或希望 Agent 在不装额外监控的前提下读取当前连接快照的 DSH 用户。
务必注意:
- 插件以当前 DSH 进程用户权限运行;非 root 时只能看到本用户进程,其他用户连接不可见(界面底部会标注)。安装前请自行审阅源码与 MIT 许可证。
- README 写明平台依赖为 macOS +
lsof;在其他系统上行为未在资料中承诺。 - 反向 DNS 依赖本机配置,无 PTR 则显示
—;未开代理或非 Clash 系代理时,多数连接只能看到 IP。 - WebKit 等系统网络进程无法归属到具体 App,会显示为「系统组件」。
lsof需 fork 子进程,不建议把刷新间隔压到 1 秒以下。
结尾¶
dsh-net-hosts 把 lsof 与可选的本地代理连接表合成一套只读快照,用面板回答「哪个软件连了谁」,用 net_connections 把同一数据交给 Agent。需要进一步了解实现,可看仓库 lib/collect.js、lib/proxy.js、lib/ui.js 的分工说明。