Excapesx/dsh-plugins--plugins-dsh-mobile-access ↗★ 1
dsh-mobile-access
一键启停反向代理,支持手机局域网免密访问 适合需要用手机调试或查看DSH界面的用户,需在可信局域网内使用。
同名包的其他仓库
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Excapesx/dsh-plugins#29751b625ee357d4e96591160fae11343c7d00a9&path:plugins/dsh-mobile-access说明文档
阅读完整 README ↗dsh-mobile-access
DSH 插件:在界面左栏一键启停一个内嵌反向代理,让同一局域网里的手机直接打开 DSH 界面,手机端不需要 token、不需要配对。
安装步骤见仓库根目录 README。
⚠️ 开启期间,任何能访问该端口的设备都拥有对本机 DSH 的完全控制权(等价于本机代码执行),且不需要登录。只在可信局域网里开,用完随手关闭。
目录结构
dsh-mobile-access/
├─ package.json # name / dsh.bundle.patch / dsh.client 三处声明
├─ cordis.patch.yml # bundle 层:把本包作为一行 insert 进宿主组合
└─ lib/
├─ index.js # Host 半:内嵌代理 + 控制面路由
└─ client.js # 浏览器半:左栏按钮 + 浮动面板
为什么不直接 --trusted-host
DSH 的 /api 信任围栏只放行环回(或显式 trusted)的 Host,认证又是绑定 authority 的签名 cookie。所以「让手机能访问」= 两件事都得解决。本插件的做法是:
- 重写头:把每个转发请求的
Host/Origin改写成127.0.0.1:,围栏认为这是本机自己发的请求,放行; - 现场签 cookie:用本机凭据
client-connection/browser-session的密钥,按 DSH 的v1..格式签一张dsh-auth-cookie 注入每个请求 —— 手机侧因此完全不需要凭据。
好处是不用改 DSH 任何配置、不用重启带参数,也不往手机上放任何长期 secret;代价是这个端口本身就是一把钥匙,所以默认不自动启动、面板上常驻风险提示、插件卸载或 DSH 退出时监听器随之关闭。
控制面
挂在 DSH 自己的 webServer 上,只有同源(本机浏览器)会调:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /dsh-mobile-access/state | 当前状态 + 手机该开的网址 |
| POST | /dsh-mobile-access/start | 启动代理(幂等,重复调用返回当前状态) |
| POST | /dsh-mobile-access/stop | 停止代理(未启动时是空操作) |
state 形状:
{
"running": true,
"dshPort": 51596,
"proxyPort": 3081,
"urls": [ { "ifName": "WLAN", "address": "192.168.1.7", "url": "http://192.168.1.7:3081" } ],
"error": null
}
urls 只在 running 时有内容;启动失败(端口被占、取不到签名密钥)时 error 是具体原因,面板会原样显示。
实现细节
- 代理监听
0.0.0.0:,默认3081,转发到127.0.0.1:。 - 普通 HTTP 用
http.request直通;WebSocket / 任意upgrade请求手工重建请求行后裸 socket 双向 pipe —— 不处理 upgrade 的话,手机上会话流式输出会一直转圈。 - cookie 寿命 29 天,比 DSH 默认的 30 天短一天留余量;签名密钥 32 字节,长度不对直接抛错而不是将就用。
- 启动前会过滤
169.254.0.0/16链路本地地址(网卡没拿到 DHCP 时的占位地址,手机连不上)。 - 签名密钥懒加载并缓存:
apply执行时credentials服务可能还没就绪。 - 插件被禁用/卸载时
ctx.effect的清理函数会stop(),不会留下野监听。
已知限制
- 只支持 IPv4 局域网;
urls不含 IPv6。 - 代理端口固定从
3081起,端口被占时不会自动换端口,需要你腾出来。 - 没有内置 TLS —— 手机浏览器地址栏会标「不安全」,这是明文 HTTP 的正常表现。
- 认证靠 cookie 签发,没有额外口令;安全边界完全由「端口谁能访问到」决定。