dsh-lan-link:为当前 Harness 进程提供局域网访问

前言

DeepSeek Harness(DSH)启动时会为当前进程生成一次性的 launch token,浏览器只有通过 GET /?token=… 才能换取绑定 authority 的会话 cookie;/api 与 WebSocket 都依赖这份 cookie。命令行里通常会打印一行带 token 的地址,但桌面版 Harness 监听在回环地址上,手机在同一局域网里往往既看不到这行输出,也连不上 127.0.0.1。宿主插件与 Connection 服务同进程,可以拿到已认证的 URL,却仍需解决「链接落盘」和「非本机设备如何连上」两件事。下面介绍社区插件 dsh-lan-link(维护者 sqzw-x),它把带 token 的启动链接写入 Harness 主目录,并可选地在进程内起一个固定端口的局域网网关,让手机在可信网段内无需再粘 token。

这是什么

dsh-lan-link 是 DSH 的 admin-security 类插件,当前在 SkillHub 目录 与 GitHub 发布(MIT 许可证,package 版本 0.2.1)。它只服务当前这一个 harness 进程:一条路径是把各网卡 IPv4 对应的、带 launch token 的链接写到磁盘并注册环境变量;另一条路径(可选)是在同一 Node 进程里监听局域网端口,代持本机会话并把请求转发到回环上的 Harness,从而绕过桌面版「只绑回环、拒绝 0.0.0.0」的限制。

两种链接怎么选

README 用表格区分两种用法,落地时先想清楚设备侧要承担什么、重启后谁负责续期。

token 链接 网关(gateway.enabled)
设备需要什么 打开一次带 ?token=… 的链接 直接打开网关 URL,无需 token
谁能用 能到达 Harness 监听地址的客户端 源 IP 在 allowCidrs 内(或本机)
端口 Harness 自身端口(桌面版多为回环,手机通常不可达) 网关固定端口(如 3081)
会话凭据 落在手机(cookie,默认 30 天) 留在本机(网关代持)
Harness 重启后 端口变化则旧链接失效 网关启动时自动重新换取,设备无感

只做「把链接记下来、本机浏览器或能直连 LAN 地址的环境用 token 登录」,可以只依赖落盘文件;要在手机上稳定打开完整主机界面且不想每次粘 token,需要打开网关。

核心功能

落盘链接与环境变量

Web server 绑定后,插件把每个本机 IPv4 的 launch 链接写入 <harness home>/lan-link.txt(示例路径 ~/.dsh/lan-link.txt,权限 0600),并把 DSH_LAN_LINK 注册进 shell 环境。文件在每次 Harness 启动时覆盖;端口、网卡或网关状态变化时会重写。有网关时,DSH_LAN_LINK 优先指向网关 URL。

文件内容大致包括:网关说明行、各网卡下的 token 链接,以及本机回环用的 127.0.0.1 链接。token 本身不落盘,文件中的是换会话用的启动 URL。

进程内局域网网关

gateway.enabled: true 时,插件在同一进程内再起一个监听(默认 0.0.0.0:3081),在网关侧终结连接,再以「本机浏览器」身份向回环转发:

  1. 代持会话:通过 connection.authenticatedUrl() 在回环换取浏览器会话 cookie,转发请求代设备出示;Harness 拒绝时自动重换。
  2. 重写 Host/Origin:使请求通过 Harness /api 同源校验,行为与本机访问一致。
  3. HTML 注入:对文档注入 crypto.randomUUID 补丁(明文 HTTP 非安全上下文时浏览器会禁用该 API),以及桌面壳用于声明「主机」的标记;injectHostClaim: true 时按完整主机界面渲染,否则保持远程访客降级。非 HTML 响应尽量逐字节透传,大体积 bundle 不重压缩。

Harness 仍可用 --port 0 随机端口;固定的是网关端口。启动时若开启 verifySeam: true,会探测 host-claim 注入是否仍有效并告警。

安装与启用

插件以当前 DSH 进程权限运行,安装前建议在 GitHub 查看源码与 MIT 许可证,并确认本机 DSH 版本满足 engines 要求(Node >=22.18,DSH 见 package.json 中的范围)。

插件管理器

在「设置 → 插件」中安装 dsh-lan-link,启用后按提示重启。桌面版与 Web 版均适用。

命令行

# 从 npm
dsh plugin --profile <profile> add dsh-lan-link

# 从 GitHub
dsh plugin --profile <profile> add github:sqzw-x/dsh-lan-link

desktop profile(Electron)

desktop profile 由 Electron 应用独占管理,不能使用 dsh plugin --profile desktop …(会被拒绝)。需在 profile 目录直接改依赖,例如:

// ~/.dsh/profiles/desktop/package.json
"dependencies": { "dsh-lan-link": "^0.2.0" },
"dsh": { "profile": { "bundles": [ …, "dsh-lan-link" ] } }

在 profile 目录执行 pnpm install(或通过应用内插件管理器),重启应用。开发时可将依赖改为 link:/path/to/dsh-lan-link。

停用:配置里 - id: lan-link 并设 disabled: true(网关一并关闭);仅关对外网关则设 gateway.enabled: false。

配置示例

在 profile 的插件配置中增加(字段以 README 为准):

- id: lan-link
  name: 'dsh-lan-link'
  config:
    fileName: 'lan-link.txt'
    intervalMs: 1000
    gateway:
      enabled: true
      listenHost: '0.0.0.0'      # 绑哪个网卡;0.0.0.0 = 全部
      listenPort: 3081           # 设备访问的端口;0 = 让系统挑
      allowCidrs:                # 除本机回环外允许的客户端
        - '192.168.0.0/24'       # 只写你自己拥有的网段
      allowLoopback: true        # 是否允许本机访问(默认 true)
      username: ''               # 可选 Basic Auth,两者都非空才生效
      password: ''
      injectHostClaim: true      # 完整主机界面;false = 保持"远程访客"降级
      verifySeam: true           # 启动时探测 host-claim 缝隙是否仍在

listenHost 与 allowCidrs 是网关访问控制的主防线;Basic Auth 在明文 HTTP 上只能作补充。

典型用法与验证

启动 Harness 并启用插件后,先读落盘文件确认链接是否更新:

cat ~/.dsh/lan-link.txt

若已开网关,在同一局域网设备上应能无 token 访问(将 IP 换成你文件中的地址):

curl -s -o /dev/null -w '%{http_code}\n' http://192.168.0.2:3081/     # 期望 200,无需 token

新 shell 中可检查环境变量(有网关时一般为网关 URL):

echo "$DSH_LAN_LINK"

在当前 Harness 正在运行的前提下,仓库提供端到端冒烟(需在插件源码目录执行):

node scripts/live-smoke.mjs                    # 读 ~/.dsh/lan-link.txt 里的 token
node scripts/live-smoke.mjs --port 3081 --host 192.168.0.2

脚本会检查匿名访问 200、脚本注入、客户端 bundle 与直连一致性、host-claim 探测,以及 /api/remote.mux 的 WebSocket 升级。

适用场景与注意

适合:自家或可控局域网里,用手机或平板打开当前这台机器上的 Harness;桌面版需要固定网关端口、不想依赖 stdout 里的 launch 行;希望 token 链接集中写在 lan-link.txt 供脚本或 DSH_LAN_LINK 使用。

不适合:把 Harness 等价于 shell 的能力暴露到不可信网络。Harness 故意不支持 --host 0.0.0.0;打开网关等于在本机自愿增加一层转发,日志里来源会显示为本机。token 链接换得的会话可触达具备工具能力的 API,宿主端没有按设备撤销;吊销需删 .credentials.yaml 中 client-connection/browser-session 并重启,会踢掉所有设备。需要「人在外网」访问时,应使用 Harness 的配对/隧道类方案,而不是本插件网关。

回滚:从 profile 的 dsh.profile.bundles 与 dependencies 移除 dsh-lan-link 后重启;或仅设 gateway.enabled: false 保留落盘行为。

结尾

dsh-lan-link 把「当前进程的认证启动链接」落到 lan-link.txt 与 DSH_LAN_LINK,并在可选网关下用固定 LAN 端口、本机会话代持,解决桌面 Harness 回环监听与 launch token 难观测的问题。目录与源码:

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye