周六下午在咖啡馆,代码在家里的机器上跑,手机只有 5G。这次我用 dsh-tether 把 DSH 界面拉到了手机上——从安装到第一次批准,包括几个动手前没料到的地方。
先说清它是什么:zexadev/dsh-tether(GitHub 65 星,npm 包 dsh-plugin-tether latest 0.1.22,MIT)是独立社区项目,与 DeepSeek 无关联、未获授权或背书。它把 DSH 自己的 Web 界面通过点对点直连送到手机——跑的是原生界面,不是重写的客户端;没有机器时,Android 还能在手机上直接跑 DSH。
装之前先认清三件事
第一件,包名和仓库名不一样。仓库叫 dsh-tether,npm 包叫 dsh-plugin-tether:
dsh plugin --profile web add dsh-plugin-tether
按仓库名敲 add dsh-tether 装不上,这一步拦掉的人最多。
第二件,宿主版本是硬门槛。dsh 0.1.7 起,peer 范围不覆盖宿主就直接拒绝安装——装的时候报错,不是静默留坑。README 列的已验证区间从 0.1.0-rc.7 一路到 0.2.1-rc.2,我这台是 0.2.1-rc.2,落在区间内。
第三件,手机装哪个包看架构。近十年的 Android 手机都取 arm64;arm 是 32 位老设备,x86/x86_64 给模拟器和 ChromeOS,装错会在安装时被拒。只有 arm64 含本地模式运行时。
安全档位先说:静态扫描「🔵 含敏感能力」——可执行外部命令、读写删除本地文件、发起外部网络请求,共 5 处证据。尚无人工评估,本站也尚未做风险分级。这不等于危险,但也别当安全读。
机器端:装完必须重启一次
装完插件,dsh web 要重启。这一步没有提示,差别却很大:不重启,侧边栏底部什么都没有,你会以为装失败了。
重启后侧边栏底部多出一个 Connect phone。它不是设置项,就是个按钮,点下去生成一行文本。
那一行文本:6 位码,10 分钟,3 次
有效期 10 分钟,配对码 6 位 CSPRNG,每个窗口 3 次尝试。
这三个数字决定操作节奏:先点按钮再掏手机,别反过来。我第一次先在手机上找入口,回头再点电脑端,虽然没超时,但没必要冒这个险。配对成功后授权依据是手机侧 iroh 公钥,由 iroh 的 TLS 验证,伪造不了——所以凭证不是"那行文本长期有效",而是一把钥匙。
手机上:Add computer → 粘贴 → 命名 → 连接
打开 App,点 Add computer,把整行粘进去——不是只粘 6 位码。然后给机器起个名字,点连接。
这步别自作聪明:我第一次只复制了看起来像码的那一段,连接失败,回头重来。连上之后体验比预期顺,再打开 App 会自动重连。
我怎么确认它没走中继
这是整个流程里我最在意的一步。插件会在选定路径上报出一个公网地址——报出来了,说明两端打洞直连,中继没被用到。
我的验证条件是:手机关 Wi-Fi 只留 5G,电脑在家宽,两边不在同一网络;仍然报出公网地址,且状态栏没有 Wi-Fi 图标。机制上,两端通过 iroh 打洞直连,失败才回退中继,而中继只承载它读不懂的密文。所以不需要公网 IP、不用自建隧道、不必同一个 Wi-Fi。
但有一条必须如实说:relay 回退从未在真实网络触发过,延迟表现没有实测数据。我这次打洞成功,也就没验证到它。
用它干活:审批通知只通知,不替你批
真正让这套东西成立的是审批环节。Agent 在机器上等你批准时,手机弹系统通知,但插件刻意不代替你批准——它只把"它在等你"送到锁屏,批准仍在 DSH 自己的界面里完成。
这个边界划得对。一个能远程代批的客户端,等于把"人在回路"变成"通知即放行",出了事没人负责。
多机切换:不用重输凭证
手机侧边栏底部的 My computers 可切换、重命名、移除、新增;换机器不用重输凭证,电脑端也能随时生成新码。多台机器就是这样并列在底部,点一下切换,会话各自独立,不会串。
一个必须接受的短板:不保持后台连接
App 打开才连,退到后台不保持连接——Android 的 doze 也不允许。锁屏久放后再打开要等它重连(会自动连,只是要等那一下)。
所以它不是"随时待命"的推送式客户端。期待"任务跑完手机自动响"的人会对不上;它适合"想起来看一眼,打开就有"。
没机器的时候:Android 本地模式
这是另一套东西。顶栏 Hosts → Run on this phone:首次启动先解包运行时,约 9 秒;之后进界面约 2 秒。去设置填 API Key 就能对话。
Node 24 与 dsh 0.2.1-rc.2 的完整依赖树打进 APK,首次离线解包,之后只有模型调用要网络;运行时随 App 升级;前台服务加常驻通知,切后台或锁屏不会被回收,进程被杀后下次启动自动重启,会话已在磁盘上。真机数据在 Redmi / Android 16 上测:全新安装 9.1 秒可用、后续 2.1 秒,node 进程后台存活 30 秒,强杀重开自动恢复。
代价也要说:手机没有 bash,也没有完整 coreutils,依赖 shell 的工具不完整(聊天与文件读写不受影响)。arm64 包约 83 MB,其余约 32 MB——83 MB 不是安装包异常,它带着整个运行时。
得说清的三条安全边界
第一,浏览器信任规则挡的是"浏览器被当成替身":两个 HTTP 路由沿用 dsh 对 /api 的规则——Host 必须是 loopback、拒绝显式跨站标记、Origin 必须匹配 Host,恶意页面跨站请求与 DNS rebinding 都吃 403。
第二,它挡不住本机进程。本机进程可以给出 loopback Host、自己换一个配对码、把自己配成"手机"——能在这台机器上执行代码的攻击者,可以把它变成长期访问。别在跑不可信代码的机器上装它。
第三,手机侧也有边界:本地代理只监听 127.0.0.1,但手机上任何其他 App 都能连上去拿到完整 DSH 界面,端口由 host 推导、比随机端口好猜。手机上有不可信 App,或者手机落到别人手里,等于把开发机暴露了。
这次没验证到的部分
配对(含错码被拒)、审批送达、多机切换在真机验证过;本地模式在 Android 真机验证过;直连路径我用"关 Wi-Fi 只留 5G"复现过。iOS 是 beta——只在 CI 构建、从未在真机运行、未签名需自签(免费 Apple ID 签名 7 天过期)。relay 回退没在真实网络触发过。
想横向看其它 DSH 插件的中文说明,DeepSeek Harness Hub 插件清单 按分类列了安装命令与版本门槛。
总结
这条链路的价值不在"远程",而在没有中间服务器、不需要公网 IP、中继只碰密文——代价是权限边界更依赖你自己的机器与手机是否干净;更多同类插件的中文清单见 DeepSeek Harness Hub 插件清单。
适合与不适合
适合:经常不在开发机所在网络、又想随时看一眼 Agent 跑到哪的人;不想为一个远程入口再自建隧道或中继的人;Android 用户、且希望没机器时也能在手机上跑 DSH 的人;需要同时管两三台机器的人。
不适合:只在同一 Wi-Fi 下用手机——LAN 方案更简单,直连能力全浪费;要求 App 常驻后台随时推送的人——它打开才连;在机器上跑不可信代码的人——本机进程边界挡不住;只接受已签名 iOS 正式版的人——iOS 目前是自签 beta,且从未在真机运行过。
标签:dsh-tether、DeepSeek Harness、远程连接、点对点、Android
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。