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

随身远程控制 afeack/dsh-mobile-harness

DeepSeek Harness
afeack2 天前有提交已提供中文文档扫描:含敏感能力

扫码用手机浏览器远程操控电脑上的 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 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。
预览分享卡片长什么样 ↓afeack/dsh-mobile-harness
分享 · DeepSeek Harness Hub
afeack/dsh-mobile-harness

扫码用手机浏览器远程操控电脑上的 DSH 会话

这是你的仓库?认领条目

回到顶部