🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
← 全部攻略

dsh-pocket 是怎么让手机和电脑共用同一个 DSH 的

其他类文章2026/9/30 发布3 次阅读

dsh-pocket 一句话能说清:电脑上跑 dsh web,手机扫码看到的是同一个界面、同一份会话、同一条输出。可核查的底数:1,179 星、周下载量 2,995、npm 包 dsh-pocket @ 2.10.6、Node >=22、GPL-2.0,本站信任档位「已验证」(L4 · 真实安装)。值得拆的是机制——手机与电脑之间隔着浏览器同源策略、局域网地址与公网隧道三层,它是怎么缝成「一块屏」的。

一个 npm 包、八个文件:先把「装得上」做简单

| 文件 | 职责 |

|---|---|

| lib/index.js | 入口:起代理、注册 RPC、密码管理、局域网总开关、桌面端适配 |

| lib/settings.mjs | 设置持久化:局域网访问开关 + 局域网密码开关 |

| lib/service.mjs | 服务:代理生命周期(端口自适应)、隧道自动恢复、状态快照(二维码) |

| lib/proxy.mjs | 改头反向代理:Host/Origin 改写、HTTP/WebSocket 透传、压缩、按 Host 分令牌 |

| lib/tunnel.mjs | cloudflared:多镜像源下载(清华优先)、多线程、启动、解析公网 URL |

| lib/web-rpc.js | loopback RPC:status / tunnel.start / tunnel.stop / lan.setEnabled / update |

| client/ | 设置页「手机访问」+ 移动端适配 |

| bin/dsh-pocket.mjs | CLI:局域网/公网模式,打印 URL 与二维码 |

一个 npm 包、一个设置页,没有核心与适配器要分开装,也不需要账号和服务器——这是「零依赖安装」的口径。它也解释了那个高频困惑:装完、甚至更新完了,设置里却看不到「手机访问」——不是安装失败,而是运行中的 dsh web 进程仍加载旧代码,设置页入口只在重启后生效;重启后它才出现在与「通用设置」「模型」同级的位置,入口仍不见就先确认 dsh --version 可用。pnpm 9 用户还可能在安装或更新时吃到 ERR_PNPM_ADDING_TO_ROOT,这是 pnpm 9 对 workspace 根加包的限制,命令末尾补 -w 即可。

同屏的第一层:改头反向代理把请求落回 loopback

DSH 的 web 服务默认只服务本机,浏览器对 Host 与 Origin 又敏感:手机请求的 Host 头写的是局域网 IP 或公网域名,原样转发会被当成异常来源。lib/proxy.mjs 做的就是改头反向代理——把 Host 与 Origin 改成 loopback 再送给本机 DSH,最后把响应带回手机。手机看到的与电脑上打开的本就是同一份前端资源,只是到达前被重新包装过一次。手机流量贵,所以大 JSON 响应也在这一层自动走 gzip/brotli,长会话体积从 17MB 量级压到约 1MB(brotli 质量 6),DSH 侧不用改。

同屏的第二层:WebSocket 全透传,而不是定时轮询

「实时」来自流式输出走 WebSocket 全透传:电脑上模型在吐字,手机上同步在滚,还能双向操作。代理只做通道透传、不做改写。通道要长期活着就绕不开断链:路由器 NAT 表会老化,手机端省电机制会静默掐掉长连接;内置心跳保活正是对抗它,断线后自动重连。

同屏的第三层:按 Host 区分的访问令牌

认证按 Host 区分:公网 Host 必验令牌,局域网 Host 按开关决定是否验。公网密码存 $DSH_HOME/dsh-pocket/token,局域网密码存 $DSH_HOME/dsh-pocket/token-lan,开关与自定义标记落在 settings.json——三条路径分开,关掉局域网密码不会让公网变松。尝试次数也有限:同一 IP 连错 5 次锁 60 秒,全局失败超阈值时短暂全锁。登录态同理,它绑定在电脑的 dsh web 进程上——只要进程不重启,手机就不用再输。

局域网开关:不是把二维码藏起来,而是真的拦请求

「局域网访问」开关默认开着,切换时会弹窗提醒。关闭后代理会直接拦截发往局域网 Host 的请求,二维码与链接立即失效、手机打不开,公网不受影响——这不是「少画一个二维码」的前端把戏,拦截发生在服务端。局域网密码默认开启是安全优先;只有自己用时可以关掉,之后扫码直连、免输密码,但仅同一网络设备可访问。

公网判定 fail closed:换域名绕过密码这条路被堵死

公网这条线最容易想歪的是:「我自建隧道、用自己的域名指向本机端口,算不算公网?」答案是按公网处理。issue #66 之后公网判定是 fail closed:除本机(loopback)与局域网私网地址外,一切陌生域名一律强制公网密码,不存在换域名绕过密码的口子——这对自建反代的人不算友好,却把默认姿势拉向安全一侧。

公网那条腿:cloudflared 隧道与端口自适应

公网的底座是 cloudflared。lib/tunnel.mjs 负责多镜像源下载(清华优先)、多线程、启动,并以 HTTP/2 解析出公网 URL;快速隧道地址每次重启都变,想固定就走「命名隧道」:填 Cloudflare Tunnel Token 加自己的域名,重启后地址不变。端口由 lib/service.mjs 管代理生命周期、走端口自适应,CLI 也能用 --port 指定;隧道在 DSH 重启后会重新拉起。

总结

dsh-pocket 的同屏不是黑魔法,而是改头反向代理、WebSocket 全透传、按 Host 区分的令牌认证、传输压缩与 cloudflared 隧道叠出来的结果;想横向对照同类插件与说明,可以从 DeepSeek Harness Hub 插件清单 进去挑。理解了这几层,扫码与断链就不难解释。

适合与不适合

适合:经常离开电脑但希望 agent 继续干活的人;手边只有手机、没有 SSH 和远程桌面的人;通勤或外出时想看流式输出、点审批的人。

不适合:在涉密或公司网络里想开公网的人——那等于把能执行代码的 DSH 暴露到互联网,开前请确认合规;想把修改版闭源分发的人——GPL-2.0 要求修改版同样以 GPL 开源并保留版权声明;需要多人共用凭据的团队——它的设计围绕单人自用展开。

标签:dsh-pocket、DeepSeek Harness、移动端同屏、远程访问、cloudflared

本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。

60 秒视频版 · AI 辅助生成并人工校对
回到顶部