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

移动端配对 NOirBRight/dsh-mobile-pairing

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

让手机安全配对并远程连接 DSH 主机

29.2/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add NOirBRight/dsh-mobile-pairing
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]—
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
数据截至 2026/10/04·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 40 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 33 处,展示前 33 条)
  • 执行外部命令来自配置/变量
    lib/index.js:276
    spawn: (command, args) => spawn(command === 'cloudflared' ? resolved.cloudflaredPath : command, args, { stdio: ['ignore', 'pipe', 'pipe'] }),
  • 发起网络请求
    lib/client.js:460
    fetch(src, {
  • 发起网络请求
    lib/client.js:548
    const [statusResponse, devicesResponse] = await Promise.all([fetch(REMOTE_SETTINGS_API.status, {
  • 发起网络请求
    lib/client.js:551
    }), fetch(REMOTE_SETTINGS_API.devices, {
  • 发起网络请求
    lib/client.js:585
    const decoded = decodeEndpointSaveResult(await (await fetch(REMOTE_SETTINGS_API.endpoint, {
  • 发起网络请求
    lib/client.js:624
    await fetch(REMOTE_SETTINGS_API.revoke, {
  • 发起网络请求
    lib/client.js:635
    await fetch(REMOTE_SETTINGS_API.label, {
  • 写入剪贴板
    lib/client.js:648
    await navigator.clipboard.writeText(url);
  • 读取本地文件
    lib/keys.js:20
    jwk = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    lib/keys.js:43
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/keys.js:44
    writeFileSync(path, JSON.stringify(jwk, null, 2));
  • 写入本地文件
    lib/keys.js:45
    chmodSync(path, 0o600);
  • 读取本地文件
    lib/tokens.js:28
    const parsed = JSON.parse(readFileSync(path, 'utf8'));
  • 写入本地文件
    lib/tokens.js:222
    mkdirSync(dirname(this.path), { recursive: true });
  • 写入本地文件
    lib/tokens.js:224
    writeFileSync(tmp, JSON.stringify({ devices: this.devices }, null, 2));
  • 写入本地文件
    lib/tokens.js:225
    renameSync(tmp, this.path);
  • 写入本地文件
    lib/tokens.js:226
    chmodSync(this.path, 0o600);
  • 读取本地文件
    lib/compatibility.js:38
    return JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
  • 读取本地文件
    lib/compatibility.js:51
    const manifest = JSON.parse(readFileSync(join(directory, 'package.json'), 'utf8'));
  • 写入本地文件
    lib/gateway-port.js:13
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/gateway-port.js:14
    writeFileSync(path, String(port) + '\n', { encoding: 'utf8', mode: 0o600 });
  • 读取本地文件
    lib/gateway-port.js:19
    const raw = readFileSync(gatewayPortPath(dshHome), 'utf8').trim();
  • 删除本地文件
    lib/gateway-port.js:30
    unlinkSync(gatewayPortPath(dshHome));
  • 发起网络请求
    lib/public-endpoint.js:50
    const response = await adapters.fetch(health.toString());
  • 发起网络请求
    lib/public-endpoint.js:77
    response = await adapters.fetch(endpoint + '/.well-known/dsh-mobile');
  • 发起网络请求
    lib/public-endpoint.js:122
    async fetch(url) {
  • 发起网络请求
    lib/public-endpoint.js:126
    const response = await globalThis.fetch(url, { signal: controller.signal });
  • 读取本地文件
    lib/endpoint-settings.js:52
    raw = readFileSync(path, 'utf8');
  • 写入本地文件
    lib/endpoint-settings.js:72
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/endpoint-settings.js:74
    writeFileSync(tmp, JSON.stringify(selection, null, 2));
  • 写入本地文件
    lib/endpoint-settings.js:75
    renameSync(tmp, path);
  • 发起网络请求
    lib/endpoint-mux.js:55
    const response = await fetch('http://127.0.0.1:' + port + '/.well-known/dsh-mobile');
  • 读取本地文件
    lib/local-preview.js:43
    return { body: readFileSync(path), contentType: previewContentType(path) };
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-brand@deepseek-ai/dsh-invariants@deepseek-ai/dsh-session@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-scope@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-connection
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 手机安全配对
  • 远程连接主机

DSH 移动端远程配对插件

README

由 DeepSeek 最新模型翻译生成
@dsh-mobile/pairing DSH Mobile 的 Host 插件。正式版可安装在日常 :3080 或 lab :3082 web profile 中;每个 DSH 进程独立提供配对管理、回环 Host Gateway、WebRTC Direct 与加密 Tunnel Fallback。 Changelog 0.1.22 接受 0.1.6 及之后的 @dsh-mobile/e2e-tunnel 发布版;构建与兼容性检查仍以已验证的 v0.1.6 发布版为目标。 0.1.21 支持 DSH 0.1.7-rc.1,Host 依赖范围不设上限。要求 @dsh-mobile/e2e-tunnel@0.1.6 作为非可选 peer。发布包没有 Git 运行时子依赖;确切的 Git tag 只作为本仓库的构建依赖保留。Tunnel 是库,不是 DSH bundle,无需改动 DSH 核心。 0.1.19 Relay 重新落座时,只要还没有设备获得授权,Host 就留在未过期的 QR room 里。全新的 Host 不再每 15s 腾空 offer room,避免握手还没完成就退出。 0.1.17 空的 Relay room 会自行重新落座:已停止的 campaign 不再复用,插件 dispose 会腾出 Host 席位,存活的 room 按短间隔重新检查。
展开完整文档(README 剩余 1 节)
@dsh-mobile/pairing

DSH Mobile 的 Host 插件。正式版可安装在日常 :3080 或 lab :3082 web profile 中;每个 DSH 进程独立提供配对管理、回环 Host Gateway、WebRTC Direct 与加密 Tunnel Fallback。

Changelog

0.1.22

接受 0.1.6 及之后的 @dsh-mobile/e2e-tunnel 发布版;构建与兼容性检查仍以已验证的 v0.1.6 发布版为目标。

0.1.21

支持 DSH 0.1.7-rc.1,Host 依赖范围不设上限。要求 @dsh-mobile/e2e-tunnel@0.1.6 作为非可选 peer。发布包没有 Git 运行时子依赖;确切的 Git tag 只作为本仓库的构建依赖保留。Tunnel 是库,不是 DSH bundle,无需改动 DSH 核心。

0.1.19

Relay 重新落座时,只要还没有设备获得授权,Host 就留在未过期的 QR room 里。全新的 Host 不再每 15s 腾空 offer room,避免握手还没完成就退出。

0.1.17

空的 Relay room 会自行重新落座:已停止的 campaign 不再复用,插件 dispose 会腾出 Host 席位,存活的 room 按短间隔重新检查。dsh-pair-mux 通过 DSH_PAIR_MUX_BACKEND_HOMES 跟随 $DSH_HOME/mobile/gateway-port,因此 gatewayPort: 0 不再让 mux 指向已失效的回环端口。

0.1.16

DSH Host 包不再锁定版本。@deepseek-ai/dsh- peer 为 且可选。

Compatibility

Host 集成包和必需的 Tunnel peer 接受从各自最早支持的发布版起、不设上限的版本。Tunnel v0.1.6 仍是锁定的构建与兼容性测试目标。devDependencies 接受 DSH 0.1.7-alpha.2 及之后的发布版;lock 以 0.1.7-rc.1 搭配 Cordis 4.0.4 为目标。Cordis peer 支持 >=4.0.4 <5.0.0。DSH 0.1.7-alpha.2 和 0.1.7-rc.1 已在 package.json#dsh.compatibility.dshReleases 中验证;未知运行时仍走尽力挂载路径。

package.json#dsh.compatibility.dshReleases 中已验证的 Host 是证据,不是白名单。未知运行时会警告一次,仍走尽力挂载路径;只有复现过的失败才会进黑名单。

数据路径

1. Host Gateway 只监听回环地址,提供信令和加密 Tunnel 入口。产品 UI 在 APK 里,Gateway 不提供浏览器 Shell。
2. Quick Tunnel 或手工配置的 Custom Endpoint 将这个有界 Gateway 暴露为 Public Endpoint。
3. GET /pair 铸造五分钟、单次使用的 v4 offer;Android QR 使用 dsh-mobile://pair 深链。
4. Automatic 立刻走加密 Tunnel;同网 Direct 只在短宽限内可以抢赢,迟到的 Direct 不得抢走已打开的 Tunnel。
5. 首配签发的 Device Token 持续有效,直到 Host 侧撤销。

没有 TURN、运行时 CDN 或维护者域名依赖。Tunnel Fallback 可以走用户自己的 Host Public Endpoint,也可以显式选择官方或自托管的加密 Relay。Relay 只转发密文消息;超过旧单帧上限的 sealed frame 由 Client/Host transport 透明分片和重组。

在 GUI 中配对

打开 设置 → 插件 → 插件配置 → DSH Mobile:

- 展开卡片可查看当前 Public Endpoint 和 Host Identity。
- 二维码只给 Android APK。
- “刷新二维码”会立即铸造新的五分钟单次 offer。
- “打开完整设备管理”还可查看设备、刷新既有设备二维码和执行 Host 侧撤销。

配置位置

v0.1.21 发布包安装

按顺序安装:先把必需的 Tunnel peer 安装为顶级包,再安装 Pairing 发布归档。

~~~sh
dsh plugin --profile web add --force github:NOirBRight/dsh-e2e-tunnel#v0.1.6
dsh plugin --profile web add --force \
https://github.com/NOirBRight/dsh-mobile-pairing/releases/download/v0.1.21/dsh-mobile-pairing-0.1.21.tgz

只把 @dsh-mobile/pairing 映射到 profile 的 dsh.profile.bundles;Tunnel 是 peer 库,没有 dsh.bundle entry。包内 cordis.patch.yml 会插入 Remote loader;默认配置面向日常 :3080:

~~~yaml
- id: dsh-mobile-pairing
config:
dshHost: 127.0.0.1
dshPort: 3080
gatewayBind: 127.0.0.1
gatewayPort: 0

lab profile 使用 :3082 时,将该 profile 的配置覆盖为 dshPort: 3082 和独立的 gatewayPort。产品默认是一台 Host 一个 Gateway(gatewayPort: 0);手机只连接二维码里的 Public Endpoint,不会连到维护者机器。可选的 dsh-pair-mux 只跑在操作者自己的 Host 上回环。Gateway 在 listen 后把实际端口写入 $DSH_HOME/mobile/gateway-port;mux 通过 DSH_PAIR_MUX_BACKEND_HOMES 每次请求重读这些文件,不必把 gatewayPort: 0 钉死成历史端口。仍可用 DSH_PAIR_MUX_BACKENDS 列出静态端口,两者可并用。

| 键 | 默认 | 说明 |
| appUrl | dsh-mobile://pair | Android QR / Deep Link 入口 |
| endpointMode | quick | GUI 只显示 quick(临时地址)和 relay(Relay);custom 仅作为旧配置兼容模式保留 |
| customEndpointUrl | 无 | 旧 operator overlay 兼容字段;不在当前 GUI 选项中显示 |
| relayUrl | 无 | relay 模式下必填,必须是无凭据的 WSS URL |
| gatewayBind / gatewayPort | 127.0.0.1 / 0 | Host Gateway 始终只允许回环绑定 |
| cloudflaredPath | cloudflared | 默认 Quick Tunnel 可执行文件 |
| quickTunnelCommand / quickTunnelArgs | cloudflared 默认 argv | 可换成 natapp / cpolar / frpc 等能打印 HTTPS URL 的命令 |
| quickTunnelEndpointPattern | trycloudflare.com | 从子进程日志里抽出 HTTPS 端点的正则 |
| stunUrls | [stun:stun.cloudflare.com:3478] | 仅 STUN;TURN/TURNS 会 fail loud |
| dshHost / dshPort | 127.0.0.1 / 3080 | 有界 Gateway 的 DSH 上游;lab 写成 3082 |
| codeTtlMs | 300000 | 首配 offer/code 有效期 |

Quick Tunnel 其它提供者

默认是 cloudflared。下面只是配置样例,不打进 APK,也不作为产品默认依赖。{gateway} 会换成回环 Gateway URL。

~~~yaml

natapp

quickTunnelCommand: natapp
quickTunnelArgs: ['-authtoken', 'YOUR_TOKEN']
quickTunnelEndpointPattern: 'https://[a-z0-9-]+\\.natapp4?\\.cc\\b'

cpolar

quickTunnelCommand: cpolar
quickTunnelArgs: ['http', '{gateway}']
quickTunnelEndpointPattern: 'https://[a-z0-9-]+\\.cpolar\\.(?:cn|top)\\b'

frpc(仅旧 operator overlay 兼容;新用户使用 Relay)

quickTunnelCommand: frpc
quickTunnelArgs: ['-c', '/etc/frp/frpc.toml']
quickTunnelEndpointPattern: 'https://mobile\\.example\\.com\\b'

域名与 Relay

- 临时域名:endpointMode: quick 自动生成,不能手工固定。
- 旧 Custom Endpoint:仅为已有 operator overlay 保留兼容,不在当前 GUI 选项中展示;Relay 用户只选择两个预置 Relay 区域。
- Relay:选择 endpointMode: relay 并填写 relayUrl。官方区域和 Docker 自托管部署见 relay/deploy/README.md。每个 Client Instance 使用独立 Room。
- dsh.noirbright.top、dshweb.noirbright.top、dshapp.noirbright.top 等个人域名只能作为个人恢复基础设施,不是产品默认值或依赖。

严禁启动共享同一 DSH_HOME 的第二个 DSH 进程来承载本插件。

维护边界

- 单一来源:本仓库是 @dsh-mobile/pairing 的唯一来源;dsh-mobile 等下游通过已发布的 tag/tarball 消费,不维护第二份源码镜像。
- 设置图标兼容性:设置导航的远程图标通过临时 DOM patch 替换官方齿轮(官方 settings.section 暂无 icon 字段)。这是已接受的临时兼容性限制,Host 导航结构变更时静默回落为默认齿轮,不影响配对与会话功能。

验证

~~~sh
npm test
npm run typecheck
npm run build
npm run verify:packed
npm pack --dry-run

verify:packed 需要 pnpm 11.7.0。它会在安装前检查选中的可执行文件,版本不符就直接失败;如果默认版本不是 11.7.0,把 PNPM_BIN 指向已安装的 11.7.0 可执行文件,例如 PNPM_BIN=/absolute/path/to/pnpm.cjs npm run verify:packed。离线 frozen-lockfile 安装和 SHA-512 包完整性校验保持启用;不要绕过供应链校验。

这道关卡会读取已提交的 fixtures/alpha2/tarballs/*.tgz 和 PROVENANCE.json,其中锁定了干净的 DSH dsh-v0.1.7-alpha.2、e2e-tunnel v0.1.6 源码,以及 Pairing 0.1.22 的 tarball。源码依赖图要求 Tunnel 为 >=0.1.6;fixture 把这个范围解析到锁定的 v0.1.6 构建基线。打包后的 Pairing manifest 没有 Git 运行时子依赖。它会检查归档安全性、哈希、manifest、导出、入口点,以及递归依赖闭包,然后只安装不可变归档,并对 Host Webserver、Connection、Pairing 及其 ModuleLoader 客户端入口做冒烟测试。不需要网络,也不需要源码 node_modules。

Release

v0.1.22 · SHA-256

更新时按上述顺序安装 Tunnel 与 Pairing,然后运行 dsh plugin --profile web list 检查依赖。卸载使用 dsh plugin --profile web remove @dsh-mobile/pairing。

回滚到 v0.1.21:重新安装 v0.1.21 发布归档,检查 profile 列表,然后重启 Web 服务。
预览分享卡片长什么样 ↓NOirBRight/dsh-mobile-pairing
分享 · DeepSeek Harness Hub
NOirBRight/dsh-mobile-pairing

让手机安全配对并远程连接 DSH 主机

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部