扫码用手机浏览器远程操控电脑上的 DSH 会话
31.4/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add afeack/dsh-mobile-harness该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · tool
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 2 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 37 处,展示前 35 条)
- 发起网络请求app/www/download-hook.js:50
response = await fetch(url, { credentials: 'include', cache: 'no-store' }); - 写入本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:117
const sink = createWriteStream(target) - 读取本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:216
const info = statSync(candidate) - 读取本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:233
if (statSync(own).size >= MIN_BINARY_BYTES) return { exe: own, source: 'plugin' } - 读取本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:308
try { if (existsSync(temp)) unlinkSync(temp) } catch { } - 删除本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:308
try { if (existsSync(temp)) unlinkSync(temp) } catch { } - 写入本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:311
mkdirSync(join(this.stateDir, 'bin'), { recursive: true }) - 读取本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:332
try { if (existsSync(target)) unlinkSync(target) } catch { } - 删除本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:332
try { if (existsSync(target)) unlinkSync(target) } catch { } - 写入本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:333
renameSync(temp, target) - 读取本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:391
if (existsSync(file)) unlinkSync(file) - 删除本地文件plugins/dsh-mobile-harness/lib/cloudflared.js:391
if (existsSync(file)) unlinkSync(file) - 发起网络请求plugins/dsh-mobile-harness/lib/proxy.js:1207
const upstream = http.request( - 读取本地文件plugins/dsh-mobile-harness/lib/service.js:24
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) - 发起网络请求plugins/dsh-mobile-harness/lib/service.js:179
const response = await fetch(tokenUrl, { redirect: 'manual' }) - 读取本地文件plugins/dsh-mobile-harness/lib/service.js:199
if (!existsSync(file)) return null - 读取本地文件plugins/dsh-mobile-harness/lib/service.js:200
const text = readFileSync(file, 'utf8') - 读取本地文件plugins/dsh-mobile-harness/lib/state.js:64
if (!existsSync(file)) return defaultState() - 读取本地文件plugins/dsh-mobile-harness/lib/state.js:66
const parsed = JSON.parse(readFileSync(file, 'utf8')) - 写入本地文件plugins/dsh-mobile-harness/lib/state.js:86
mkdirSync(dir, { recursive: true }) - 写入本地文件plugins/dsh-mobile-harness/lib/state.js:88
writeFileSync(file, JSON.stringify(state, null, 2)) - 写入本地文件plugins/dsh-mobile-harness/lib/state.js:90
chmodSync(file, 0o600) - 读取本地文件plugins/dsh-mobile-harness/lib/state.js:108
const text = readFileSync(join(resolveStateDir(), 'password.txt'), 'utf8').trim() - 读取本地文件plugins/dsh-mobile-harness/lib/tailscale.js:27
if (existsSync(candidate)) return candidate - 执行外部命令来自配置/变量plugins/dsh-mobile-harness/lib/tls.js:39
const result = spawnSync(candidate, ['version'], { windowsHide: true, timeout: 5000 }) - 写入本地文件plugins/dsh-mobile-harness/lib/tls.js:55
mkdirSync(dir, { recursive: true }) - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:58
if (existsSync(keyPath) && existsSync(certPath)) { - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:59
return { key: readFileSync(keyPath), cert: readFileSync(certPath) } - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:66
if (!existsSync(confPath)) writeFileSync(confPath, '[req]\ndistinguished_name = dn\n[dn]\n') - 写入本地文件plugins/dsh-mobile-harness/lib/tls.js:66
if (!existsSync(confPath)) writeFileSync(confPath, '[req]\ndistinguished_name = dn\n[dn]\n') - 执行外部命令来自配置/变量plugins/dsh-mobile-harness/lib/tls.js:67
const result = spawnSync( - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:79
if (!result.error && existsSync(keyPath) && existsSync(certPath)) { - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:80
return { key: readFileSync(keyPath), cert: readFileSync(certPath) } - 读取本地文件plugins/dsh-mobile-harness/lib/tls.js:87
if (!existsSync(pfxPath)) { - 执行外部命令固定命令plugins/dsh-mobile-harness/lib/tls.js:97
spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', script], {
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(139 字)↓
一个为Deepseek Harness设计的远程控制插件–拥有四种通道可选(Tailscale / SakuraFrp / Cloudflare / LAN),您只需要使用您的浏览器,扫一个码,就能够实现随时随地监控/使用DSH!您也可以选择下载我们的APK获得更好的使用体验!
README
由 DeepSeek 最新模型翻译生成DSH Mobile Harness
把电脑上的 DeepSeek Harness,装进你的手机。
扫码即连 · 浏览器就能用(App 可选)· 四条网络入口 · 设备逐台准入
面板:一个开关 + 三张卡
电脑端面板:一个总开关——连接 / 网络入口 / 设备准入。
下载:插件(电脑端)→ npm 或 离线包 1.0.2;手机 App(Android,可选)→ v1.0.0 APK。两者分开发布,版本各自独立。
功能
给 DSH 加上远程控制功能。只用浏览器,扫码就能体验随身携带的 DSH。
如果你不满足于网页版的体验,可以下载我们的 APK,安卓客户端会持续更新。
担心别人连上你的电脑?不用怕:首次授权确认 + 设备管理 + 随机密码,三重保护你的连接安全。
展开完整文档(README 剩余 1 节)
DSH Mobile Harness
把电脑上的 DeepSeek Harness,装进你的手机。
扫码即连 · 浏览器就能用(App 可选)· 四条网络入口 · 设备逐台准入
面板:一个开关 + 三张卡
电脑端面板:一个总开关——连接 / 网络入口 / 设备准入。
下载:插件(电脑端)→ npm 或 离线包 1.0.2;手机 App(Android,可选)→ v1.0.0 APK。两者分开发布,版本各自独立。
功能
给 DSH 加上远程控制功能。只用浏览器,扫码就能体验随身携带的 DSH。
如果你不满足于网页版的体验,可以下载我们的 APK,安卓客户端会持续更新。
担心别人连上你的电脑?不用怕:首次授权确认 + 设备管理 + 随机密码,三重保护你的连接安全。
- 我们提供四种远程方式,适合不同人群:
- ①cloudflare(免注册、免费、最省事,代价是每次重启 DSH 都要重新扫码登录)
- ②外部隧道(内网穿透,需注册、可能付费、需实名,好处是最稳定,重启 DSH 后保留原来的登录,不用再扫码)
- ③Tailscale(手机和电脑都要装额外软件,数据走境外服务器,延迟高,不推荐,需注册)
- ④LAN(适合局域网范围,稳定但距离有限)
| 部分 | 是什么 | 必需吗 |
| 插件 | 在 DSH 里加一页「远程访问」:网关、密码、二维码、隧道、设备准入 | 必需 |
| App | 4 MB 的 Android 壳:相机扫码、记住密码、下载落盘 | 可选(只有 Android) |
手机不一定需要 App。 用浏览器(最好用 chrome)扫一下面板上的二维码、确认一次,就能接着用电脑上的同一个 DSH。
iPhone / iPad、鸿蒙不装 App 也行:浏览器打开同一个网址即可,还能「添加到主屏幕」当 PWA。
不是另开一个账号,是同一台电脑、同一个会话:上下文、工具、文件都还是电脑上那份。
安全
- 网关只监听 127.0.0.1,不监听 0.0.0.0、不做端口映射。
- 三层准入:密码 → 6 位配对码两端核对 → 设备白名单。
- 扫码不等于放行:扫完落地的是等待页,页面上那串配对码要和你电脑面板上的一致,点了「允许」才真正进站。
- 移除 = 立刻断开 + 撤销信任,下次要重新配对;拉黑 = 永久拒绝。
- 诊断包是白名单字段,不含密码、session、设备 token。细节见 SECURITY.md。
快速开始
0. 你需要
- 一台跑着 DSH 的电脑(Windows / macOS / Linux;本项目在 Windows 11 上开发与实测)
- DSH ≥ 0.2.1-rc.3,Node ≥ 22
- 一个浏览器(手机、平板、另一台电脑都行);想用相机扫码再准备一台 Android 8.0+
1. 装插件
方式 A:npm(最快)
dsh plugin --profile desktop add dsh-mobile-harness
方式 B:一键脚本(从仓库)
git clone https://github.com/afeack/dsh-mobile-harness.git
cd dsh-mobile-harness
node scripts/install-plugin.mjs --profile desktop # 换成你的 profile 名字
cd ~/.dsh/profiles/desktop && pnpm install
脚本会往 profile 的 package.json 里写一条依赖和一个 bundle 条目,重复跑是幂等的。
方式 C:手动改 profile
profile 在 ~/.dsh/profiles/<名字>(Windows 是 %USERPROFILE%\.dsh\profiles\<名字>),改两处:
{
"dependencies": {
"dsh-mobile-harness": "^1.0.2"
},
"dsh": { "profile": { "bundles": ["...", "dsh-mobile-harness"] } }
}
dsh.profile.bundles 里必须有包名,否则 DSH 不会去加载它。改完在 profile 目录里 pnpm install。
方式 D:离线 tgz 从 插件 1.0.2 release 下载 dsh-mobile-harness-1.0.2.tgz(内容和 npm 包一致),解压到 <profile>/node_modules/dsh-mobile-harness/,再把 dsh-mobile-harness 写进 dsh.profile.bundles;或者执行 pnpm add file:./dsh-mobile-harness-1.0.2.tgz。内网 / 连不上 npm 时用这条。
2. 重启 DSH
退出托盘图标,重新打开。会话侧栏会出现「远程」入口,点进去是「远程访问」面板。
3. 选择你的方式、打开开关
面板右上角把总开关打开,再选一个网络入口(见下一节),拿到网址。
4. 手机接入
A. 浏览器(先试这个)
1. 手机浏览器打开面板上的网址,或者直接扫面板上的二维码。
2. 浏览器停在等待页,页面上有一串 6 位配对码。
3. 电脑面板「设备准入」里出现同一串数字 —— 核对一致,点「允许」,再点「数字一致,允许」。
4. 手机上自动进站,之后直接刷新就能继续用。
B. 装 App(可选)
1. 装 App 1.0.0 release 里的 dsh-mobile-harness-1.0.0.apk(或仓库里的 app/dist/dsh-mobile-harness-1.0.0.apk)。iOS / 鸿蒙没有 App,用浏览器即可。
2. 打开 App → 相机扫码(或从相册选图)→ 同样核对 6 位配对码。
3. 勾「记住地址和密码」,以后换地址也能自动填。
四个入口怎么选
| 入口 | 推荐度 | 要准备什么 | 说明 |
| SakuraFrp / 任意外部隧道 | ✅ 推荐 | 已有一条 frp 隧道,填外网地址(如 https://frp-cat.com:12345/) | 地址稳定,延迟低;「自动检测」会去读 SakuraFrp 的运行日志 |
| Cloudflare 快速隧道 | ✅ 推荐(零准备) | 什么都不用 | 免账号、一键建隧道;地址每次重启都变,换地址要重新扫码;首次要下约 50 MB 的 cloudflared |
| 仅本机 | ✅ 局域网内 | 手机和电脑同一个 Wi-Fi | 最安全,出了局域网连不上 |
| Tailscale | ⚠️ 不推荐 | 两端都装 Tailscale、登录同一账号 | 能穿透 NAT,但流量常走 DERP 中继,延迟明显偏高;只在内网直连(同一局域网 / 同一 VPC)时才顺 |
为什么 Tailscale 排最后:它解决的是「没有公网入口也能连上」,代价是节点绕行——手机到电脑可能先绕到境外中继再回来,打字、翻页都能感觉到卡。有公网入口就用外部隧道,没有就开 Cloudflare;Tailscale 留给「内网直连 + 不想开公网」的场景。
第一次接入建议先用「仅本机」把扫码和配对码跑通,再切到公网入口。
常见问题
一定要装 App 吗? 不用。浏览器扫码就能用,App 只是把相机扫码、密码记忆、下载落盘这几件事做得更顺。
手机上一直转圈 / 打不开? 先确认入口选对了,地址带不带尾斜杠都试试;公网入口要等隧道状态变成「已连接」。自签证书(64702 端口)第一次会提示不受信任,点「高级 → 继续前往」。
扫码后停在「等待同意」? 这是设计。去电脑面板「设备准入」,核对那串 6 位数字,一致再点「允许」。
忘了网关密码? 面板上「重置密码」。重置后所有已连接设备都要重新输密码。
面板里找不到「远程」? 插件没装好或 DSH 没重启。检查 profile 的 package.json 里有没有依赖和 bundle 条目,然后重启。
Cloudflare 下载失败? 插件会依次试 8 个地址(官方 + 7 个镜像),全都不通才会报错。三条退路,任选一条:
1. 自己的镜像:设环境变量 DSH_CLOUDFLARED_URL 指向你能连的地址,下次点下载会先试它。
2. 手动放置:下载 cloudflared-windows-amd64.exe,改名 cloudflared.exe,放到 ~/.dsh/remote-access/bin/(Windows 是 C:\Users\<你>\.dsh\remote-access\bin\),面板会显示「程序已就绪」。
3. 本来就有:只要 PATH 里能找到 cloudflared,插件直接用它,不再下载。
下载卡住时面板上有「停止下载」;下坏了(文件损坏、下到一半)用「删除」(点两次确认),删掉重下即可。
电脑重启后手机连不上了? Cloudflare 快速隧道每次重启都会换地址,重新扫码即可;外部隧道和 Tailscale 的地址是稳定的。
能同时连几台? 「在线上限」控制,默认 3,0 表示不限。同一台手机用不同浏览器或app开多个页面算多台。
密码、二维码会不会被写进日志? 诊断包是白名单导出,不含密码与 token;面板上的二维码只含一次性票据,不含密码。
目录结构
plugins/dsh-mobile-harness/ 插件:网关、准入、二维码、隧道、面板 UI lib/proxy.js 网关(Cookie、会话、扫码票据、等待页) lib/registry.js 设备与信任、待同意队列、配对码 lib/service.js 开关、快照、诊断包 lib/cloudflared.js Cloudflare quick tunnel lib/tailscale.js Tailscale 探测 lib/phone-tool.js 手机协助(读屏 / 点按) lib/client.js 面板 UI(React) app/ Android 客户端(Capacitor 6,可选) www/index.html 登录页、扫码、手机协助 android/app/src/main/java/com/dsh/remote/ 原生桥、轮询、无障碍服务 scripts/install-plugin.mjs 安装脚本 assets/ README 截图
状态与路线图
- 1.0.0(2026-10-31):四条入口、扫码 + 配对码、设备准入、下载钩子;浏览器与 App 两条路都能用。
- 手机协助(P2):读屏、点按、输入、滚动、开 App 都已实现,但界面在 1.0 里默认隐藏,等验收后再放出来。需要系统无障碍服务;支付 / 银行 / 系统设置类界面一律拒绝。
- P3:通知、音量、勿扰、手电、亮度、深链打开 App。
致谢
- DeepSeek Harness:宿主。
- jsQR、Capacitor、cloudflared。
License
MIT。第三方组件许可见 THIRD-PARTY-NOTICES.md。
DSH Mobile Harness 把桌面端 DeepSeek Harness 会话带到手机上。DSH 插件加一个网关,带密码、一次性扫码票据、四条网络入口,以及按设备准入控制。
不用装 App。 任何浏览器都能扫码、输密码,接着用同一个桌面会话。4 MB 的 Android App 是可选的:相机扫码、记住密码、下载到手机。原生 App 目前只支持 Android —— iOS / iPadOS 和 HarmonyOS 上直接用内置浏览器(同一个网关、同一套准入控制,添加到主屏幕当 PWA 用)。
- 四条网络入口:外网隧道(SakuraFrp)和 Cloudflare 快速隧道推荐;局域网只适合本地用;Tailscale 能用,但通常走中继,延迟更高。
- 配对:密码 → 两端都显示 6 位码 → 设备白名单。光扫码本身不给访问权限。
- 准入控制:在线上限、等待队列、移除 / 拉黑设备、全部踢下线。
安装(插件):
dsh plugin --profile desktop add dsh-mobile-harness
or from source:
git clone https://github.com/afeack/dsh-mobile-harness.git
cd dsh-mobile-harness
node scripts/install-plugin.mjs --profile desktop
cd ~/.dsh/profiles/desktop && pnpm install
下载按组件分开:插件 tarball 在 plugin-v1.0.2,APK 在 v1.0.0。License:MIT。把网关暴露到公网之前,先看 SECURITY.md。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
afeack/dsh-mobile-harness
扫码用手机浏览器远程操控电脑上的 DSH 会话
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,330已汉化DeepSeek 客户端
74.5
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,311已汉化DSH
71.4
智能体运行框架路由HarnessRouter/harnessrouter
智能体 harness 的统一接口。
★ 3,984已汉化DSH
71.3
这是你的仓库?认领条目