前言¶
DeepSeek Harness(DSH)的 dsh web 出于安全考虑,只监听 127.0.0.1,并且明确拒绝 --host 0.0.0.0。它的会话 cookie 带 SameSite=Strict,手机浏览器用外部链接打开只会得到 HTTP 401 dsh web authentication required。想在房间里用平板或手机操作 DSH,原生方式走不通。
dsh-lan-pair 由 FORGE-131 维护,是一个 DSH 插件加一个 45 KB 的 Android shell(App 端名为 DSH LAN)。插件在 DSH 进程内另开一个局域网端口,自己持有 DSH 会话 cookie,手机只跟插件说话,永远拿不到 DSH 启动 token。下面介绍它的安装、配对和远程访问。
它的结构¶
分两部分,缺一不可:
- 插件端(
dsh-lan-pair):在 DSH 进程内起局域网监听,反向代理到本机回环,自动完成 DSH token 交换并自己持有会话 cookie。 - App 端(DSH LAN):自动发现局域网里的 DSH 电脑,输入一次 4 位配对码,之后打开即连,用系统 WebView 全屏显示界面。
配套的还有浏览器端一个深链接方案,手机不需要 root、不需要 USB 调试、不需要自己拼 URL。
安装插件¶
前提:已装好 DSH(本插件在 0.1.7-rc.2 上验证过),并且有一个 web profile。<profile> 是你的 profile 名;用官方桌面版启动器时通常就是 DSH 版本号(例如 0.1.7-rc.2),自己用 dsh web 起的一般是 web。
1、进入 profile 目录加依赖。Windows 示例 cd %USERPROFILE%\.dsh\profiles\0.1.7-rc.2,然后:
pnpm add github:FORGE-131/dsh-lan-pair#v0.2.3
需要改代码调试时用 pnpm add link:/path/to/dsh-lan-pair 从本地目录安装。
2、在 $DSH_HOME/profiles/<profile>/package.json 的 dsh.profile.bundles 里登记包名:
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-lan-pair"
]
}
}
}
本包自带 cordis.patch.yml,登记后自动生效,不需要手动改 patch 文件。
3、重启 DSH。启动日志应出现:
[dsh-lan-pair] listening on 0.0.0.0:8099 -> 127.0.0.1:10723
[dsh-lan-pair] pairing is off until you open a window (DSH settings -> 移动设备)
默认不广播:点「开启配对」之前,手机扫描不到这台电脑。Windows 防火墙若弹出提示请允许,或手动放行这一个 TCP 端口(只对本子网):
netsh advfirewall firewall add rule name="DSH LAN Pair" dir=in action=allow protocol=TCP localport=8099 profile=private,domain remoteip=LocalSubnet
配对:四步,4 位码¶
1、电脑上打开 DSH 的「设置 → 移动设备」,点「开启配对」。
2、电脑弹出窗口显示 4 位数字,同时才开始在局域网广播。
3、在手机上输入这 4 位数字。
4、配对成功后窗口自动关闭、广播停止,App 拿到长期凭据,以后打开即连。
配对码两分钟有效、只能使用一次、输错 5 次作废。因为码只有 4 位,不限制的话一万种组合几秒就能试完。如果 App 出问题需要手填,长期密钥存在 $DSH_HOME/lan-pair.json(例如 C:\Users\<you>\.dsh\lan-pair.json),内容形如:
{ "secret": "bfrVhwqHdzue50xo", "createdAt": "2026-11-01T21:40:07.737Z" }
删掉文件再重启 DSH 会换一个新的。环境变量优先级更高,常用几个:
| 变量 | 作用 |
|---|---|
DSH_LAN_PAIR_SECRET |
覆盖长期密钥 |
DSH_LAN_PAIR_PORT |
覆盖端口(默认 8099) |
DSH_LAN_PAIR_PUBLIC_URL |
固定公网地址(命名隧道 / 反向代理时填) |
DSH_LAN_PAIR_TUNNEL |
自动拉起隧道的命令,插件从输出里抓公网地址 |
DSH_LAN_PAIR_TTL_MS |
配对码有效期(默认 120000) |
DSH_LAN_PAIR_DEBUG |
输出 mDNS 报文诊断日志 |
不开配对窗口时,也可以手动访问 http://127.0.0.1:<端口>/lanpair/open 来开启。
不在同一局域网时¶
配对是永久的,长期密钥不过期,换网络不需要重新配对;但 App 记住的是「地址」,出门时需要一个外网可达地址。两种方式:
方式一,让插件托管隧道:
$env:DSH_LAN_PAIR_TUNNEL = "cloudflared tunnel --url http://127.0.0.1:8099 --no-autoupdate"
方式二,填固定地址(命名隧道 / 反向代理):
$env:DSH_LAN_PAIR_PUBLIC_URL = "https://dsh.example.com"
插件在 DSH 源上提供 GET /lanpair/info 查当前可用地址,返回形如:
{
"ok": true,
"port": 8099,
"lan": ["http://192.168.1.14:8099"],
"publicUrl": "https://xxx.trycloudflare.com",
"pairLink": "https://xxx.trycloudflare.com/__pair?k=...",
"lanPairLink": "http://192.168.1.14:8099/__pair?k=...",
"tunnel": { "running": true, "url": "https://xxx.trycloudflare.com" }
}
插件会把 publicUrl 写进 mDNS 的 TXT 记录(remote=)。App 发现电脑时同时拿到局域网地址和远程地址,存成端点列表,连接时按 3 秒超时依次探测:先试局域网地址(在家秒连、不绕公网),不通再试远程地址(出门自动启用),第一个通的就用,无需手动切换。
安装 App¶
从 Releases 下载 dsh-lan-pair-<version>.apk,侧载安装(需要允许「未知来源」)。最低 Android 8.0(API 26),未限制 CPU 架构(不含原生库),用系统 WebView 渲染,支持 https:// 远程地址与深链接,不打包浏览器内核。应用签名是自签名证书(CN=DSH LAN Pair),不是商店签名。
深链接与典型用法¶
可以把连接地址做成二维码或快捷方式,扫一下即可连接:
dshlanpair://connect?base=<地址>&remote=<备用地址>&fallback=<再备用>&k=<密钥>
例如同时带局域网和隧道的链接:
dshlanpair://connect?base=http%3A%2F%2F192.168.1.14%3A8099&remote=https%3A%2F%2Fxxx.trycloudflare.com&k=<密钥>
日常使用流程:
1、电脑上「设置 → 移动设备 → 开启配对」。
2、手机打开 DSH LAN,列表里出现这台电脑(例如 DESKTOP-I9IRUS8 (win32) 192.168.1.14:8099)。
3、输入电脑上弹出的 4 位数字,点「连接」。
4、之后每次打开 App 都会自动连;想换电脑就按返回键调出连接面板。
扫描不到时,确认电脑上已点「开启配对」(不点就不广播),也可以在地址栏手动填 IP:端口。
适用范围与注意¶
适合同一 Wi-Fi 下想用手机操作 DSH 的人,以及需要出差后仍能连回家里那台机器的场景。
几点必须知道:
- 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证(MIT)。
- 插件依赖 DSH 内部的
connection与webServer两个服务名,以及connection.authenticatedUrl(),这些不是公开稳定 API,DSH 升级后可能变化。请在package.json的peerDependencies里锁定你验证过的 DSH 版本。 - 配对密钥只是防误连,不是强加密:局域网内是明文 HTTP,能抓包的人也能拿到会话。它防的是「同一个 Wi-Fi 下的邻居随手打开就能指挥你的电脑」这类意外暴露;需要安全请自行套 TLS 反向代理。
- Cloudflare 快速隧道(
trycloudflare.com)域名每次重启都会变,同一出口 IP 并发建多个隧道会被限流,长期使用请配命名隧道或用DSH_LAN_PAIR_PUBLIC_URL指向固定域名。 - App 侧载需要允许「安装未知来源」,首次连接 Windows 防火墙提示要放行那一个 TCP 端口。
结尾¶
它的价值在于不碰 DSH 的安全边界:不改 dsh web 的监听,不把 token 交给手机,用插件自身的端口和 4 位配对码做中间层,同时用 mDNS 把局域网和隧道地址合并成可自动切换的端点列表。
- 目录页:https://www.skillhub.cn/plugins/FORGE-131/dsh-lan-pair
- GitHub:https://github.com/FORGE-131/dsh-lan-pair