扫码配对后,用手机浏览器接管电脑上的会话与设置
29.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add copylee711/dsh-remote-control该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/20) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 24 处,展示前 23 条)
- 发起网络请求src/gateway.ts:117
if (url.pathname.endsWith('/request')) json(res, 200, this.options.pairing.request(String(input.token ?? ''), req.headers['user-agent'] ?? '', req.hea - 写入本地文件src/index.ts:73
mkdirSync(storage, { recursive: true }) - 读取本地文件src/index.ts:77
if (existsSync(prefsFile)) { - 读取本地文件src/index.ts:79
const stored = JSON.parse(readFileSync(prefsFile, 'utf8')) as Partial<Preferences> - 写入本地文件src/index.ts:91
writeFileSync(temporary, JSON.stringify(preferences), { mode: 0o600 }); renameSync(temporary, prefsFile) - 写入本地文件src/index.ts:91
writeFileSync(temporary, JSON.stringify(preferences), { mode: 0o600 }); renameSync(temporary, prefsFile) - 读取本地文件src/index.ts:112
let html = await readFile(join(distRoot, 'index.html'), 'utf8') - 读取本地文件src/index.ts:134
const info = await stat(path), etag = `"${info.size.toString(16)}-${Math.floor(info.mtimeMs).toString(16)}"` - 读取本地文件src/index.ts:140
send(req, res, headers, `${path}:${etag}`, await readFile(path)) - 读取本地文件src/index.ts:147
try { const info = await stat(path); send(req, res, { 'content-type': mime[extname(path)] ?? 'application/octet-stream', 'cache-control': 'private, ma - 读取本地文件src/pairing.ts:49
if (existsSync(options.file)) { - 读取本地文件src/pairing.ts:50
const input: unknown = JSON.parse(readFileSync(options.file, 'utf8')) - 写入本地文件src/pairing.ts:60
mkdirSync(dirname(this.options.file), { recursive: true }) - 写入本地文件src/pairing.ts:62
writeFileSync(temporary, JSON.stringify({ version: 1, devices: [...this.devices.values()] }), { mode: 0o600 }) - 写入本地文件src/pairing.ts:63
renameSync(temporary, this.options.file) - 发起网络请求src/remote/app.ts:50
const response = await fetch('/api/dsh-remote-control/manage', { method: 'POST', cache: 'no-store', headers: { 'content-type': 'application/json' }, b - 执行外部命令来自配置/变量src/system-proxy.ts:16
execFile(file, args, { timeout: 3000, windowsHide: true }, (error, stdout) => resolve(error ? '' : stdout)) - 读取本地文件src/tunnel-worker.ts:19
const cached = existsSync(join(tmpdir(), 'node-untun', `cloudflared.${version}${process.platform === 'win32' ? '.exe' : ''}`)) - 发起网络请求src/tunnel.ts:61
this.proxy = proxy && this.undici ? new this.undici.ProxyAgent(proxy) : undefined - 执行外部命令来自配置/变量src/tunnel.ts:83
const child = fork(fileURLToPath(new URL('./tunnel-worker.js', import.meta.url)), [], { env, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe', 'ipc - 执行外部命令固定命令src/tunnel.ts:101
const child = spawn('ssh', ['-T', ...options.flatMap(option => ['-o', option]), '-R', `80:127.0.0.1:${this.gateway.port}`, 'nokey@localhost.run'], { w - 发起网络请求src/tunnel.ts:137
const response = viaProxy && this.proxy && this.undici ? await this.undici.fetch(address, { ...init, dispatcher: this.proxy }) : await fetch(address, - 执行外部命令固定命令src/tunnel.ts:186
if (process.platform === 'win32' && child.pid) execFile('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true }, () => resolve())
扫描于 2026/11/1(0 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-web-frontend@deepseek-ai/cordis@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh@deepseek-ai/dsh-api-gateway@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-modules@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-dockkit@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 远程控制插件:手机扫码、电脑确认后,用手机浏览器继续会话、审批和管理设置。
README
由 DeepSeek 最新模型翻译生成dsh-remote-control
DeepSeek Harness(DSH)的远程控制插件:手机扫码、在电脑上确认后,用手机浏览器继续自己电脑上的会话、处理审批、查看文件和管理设置。电脑上的桌面应用和 dsh web 界面保持原样。
手机端界面:会话列表、对话、设置与管理
| 电脑端:选择连接方式并显示配对二维码 | 新设备扫码后,在电脑上确认 |
| 设置 → 远程控制:同一 Wi‑Fi 已开启,显示扫码配对二维码 | 电脑上弹出的配对请求:iPhone · Safari,拒绝 / 允许连接 |
功能
| 功能 | 说明 |
| 两种连接方式 | 「同一 Wi‑Fi」:手机与电脑在同一网络内直连。「任意网络」:经 Cloudflare Quick Tunnel 获得临时公网地址,不需要账号和域名 |
| 备用线路 | 「任意网络」可改走 localhost.run(使用系统自带的 ssh,不下载任何组件)。实测速度很慢,只在 Cloudflare 开不起来时手动选用 |
| 扫码配对、本机确认 | 新设备扫码后进入等待页,电脑上弹出配对请求,允许后才能访问。
展开完整文档(README 剩余 1 节)
dsh-remote-control DeepSeek Harness(DSH)的远程控制插件:手机扫码、在电脑上确认后,用手机浏览器继续自己电脑上的会话、处理审批、查看文件和管理设置。电脑上的桌面应用和 dsh web 界面保持原样。 手机端界面:会话列表、对话、设置与管理 | 电脑端:选择连接方式并显示配对二维码 | 新设备扫码后,在电脑上确认 | | 设置 → 远程控制:同一 Wi‑Fi 已开启,显示扫码配对二维码 | 电脑上弹出的配对请求:iPhone · Safari,拒绝 / 允许连接 | 功能 | 功能 | 说明 | | 两种连接方式 | 「同一 Wi‑Fi」:手机与电脑在同一网络内直连。「任意网络」:经 Cloudflare Quick Tunnel 获得临时公网地址,不需要账号和域名 | | 备用线路 | 「任意网络」可改走 localhost.run(使用系统自带的 ssh,不下载任何组件)。实测速度很慢,只在 Cloudflare 开不起来时手动选用 | | 扫码配对、本机确认 | 新设备扫码后进入等待页,电脑上弹出配对请求,允许后才能访问。新设备的首次批准只能在电脑上完成 | | 设备管理 | 查看已授权设备(显示机型和连接方式)、重命名、撤销单台或全部设备 | | 手机界面 | 独立的移动端界面:会话列表抽屉、底部输入区、分类设置页;提供浅色、深色、跟随系统三种主题 | | 会话 | 新建、搜索、重命名、归档与恢复;选择工作区、模型、思考强度、Agent 和权限模式;Markdown、代码、表格、图片、附件、停止生成、工具审批、提问与方案确认 | | 文件 | 浏览工作区,预览文本和图片,下载文件;在输入区上传附件 | | 管理 | 宿主设置、凭据、插件安装与启停、定时任务、技能目录、工作区和远程设备 | | 断线提示 | 手机与电脑失去联系时,界面顶部主动提示,恢复后自动重新读取状态;发送、审批、安装等写操作不会自动重放 | | 强调色 | 陶土橙、蓝色、黑色三选一,电脑面板、配对页、手机界面以及 copylee 的其他插件共用同一个选择 | 安装 DSH 桌面版:插件 → 添加插件,输入 @copylee/dsh-remote-control,安装后启用。 命令行(dsh web 等其他 profile): dsh plugin --profile web add @copylee/dsh-remote-control@latest 桌面应用和 dsh web 使用各自的 profile,需要分别安装。 要求:DSH 0.2.0-rc.2 或更高,Node.js 22.19+ 或 24+。「任意网络」需要电脑能访问 Cloudflare;手机不需要代理。 使用 点击左侧栏底部的手机图标,或打开 设置 → 远程控制。 1. 选择「同一 Wi‑Fi」或「任意网络」,点击「开启远程连接」。「任意网络」首次开启会下载 Cloudflare 的连接组件,并在确认公网地址可用后才显示二维码。 2. 用手机扫描二维码,或打开复制的链接。 3. 电脑上弹出配对请求,确认设备名称后点「允许连接」。 4. 手机进入远程界面。 二维码只用于配对新设备,有效期 5 分钟,点击二维码可以刷新;已配对的手机不受二维码过期影响。 配对后是否需要重新扫码: - 「同一 Wi‑Fi」:授权保存在手机浏览器里,电脑重启连接后会尽量沿用上次的端口,手机打开原地址即可继续使用;连续 30 天不使用后授权过期。 - 「任意网络」:每次开启都会换一个新地址,浏览器不会把旧地址的授权带到新地址,所以需要重新扫码并在电脑上确认。关闭连接时,这类设备记录会自动清除。 「关闭远程连接」会断开所有手机并保留「同一 Wi‑Fi」设备的授权;「撤销」立即断开对应设备并使其授权失效。已连接时改用另一种连接方式会先询问,确认后才断开当前连接。 连接不上时 - 「任意网络」开不起来:先确认电脑能访问 Cloudflare。面板的「电脑访问外网的代理」默认不使用代理;直连不通时可改为「自动检测系统代理」或手动填写 HTTP(S) 代理地址(不接受带用户名密码的地址)。走代理反而连不上时改回「不使用」。仍不行可把线路换成 localhost.run。 - 「同一 Wi‑Fi」打不开:确认手机与电脑在同一网络、路由器没有开启客户端隔离、手机没有开 VPN。Windows 防火墙可能拦截网关端口,需要在「Windows Defender 防火墙(高级安全)→ 入站规则」里手动允许面板显示的端口(TCP,建议限制为专用网络)。插件不会修改系统防火墙。 设置 | 选项 | 默认 | 说明 | | 连接方式 | 任意网络 | 同一 Wi‑Fi / 任意网络 | | 随 DSH 启动 | 关 | 启动时自动开启所选连接方式,按 profile 保存 | | 线路 | Cloudflare | Cloudflare / localhost.run(备用),只对「任意网络」有效 | | 电脑访问外网的代理 | 不使用 | 不使用 / 自动检测系统代理 / 手动填写,只对「任意网络」有效 | | 强调色 | 陶土橙 | 陶土橙 / 蓝色 / 黑色 | | gatewayPort(插件配置项) | 自动 | 固定网关端口,便于维护防火墙规则 | 安全说明 - 已授权的设备与电脑本机权限相同,可以管理设置、凭据和插件。只批准自己信任的设备。 - 「任意网络」的 HTTPS 在 Cloudflare 边缘终止,本插件不提供端到端加密。「同一 Wi‑Fi」使用 HTTP,应只在可信网络中使用。 - 手机访问的是插件自己的认证网关,而不是 DSH 的端口。未配对的设备只能打开配对页,读不到任何宿主数据;网关在内部换用宿主凭据,原始凭据不会发给手机。 - 最多保存 32 台设备,超出时淘汰最久未使用且不在线的一台;同时最多等待 16 个配对请求。 - 关闭连接或撤销设备会立即中断对应的 HTTP、WebSocket 和 SSE 连接。 数据与隐私 - 授权与偏好保存在 $DSH_HOME/dsh-remote-control/<profile>/(未设置 DSH_HOME 时为 ~/.dsh)。设备文件只保存随机密钥的 SHA-256 校验值、设备名称和时间,不保存密钥本身。 - 「任意网络」的流量经过 Cloudflare(或 localhost.run)的服务器转发;「同一 Wi‑Fi」的流量不出局域网。 - 插件不收集、不上传使用数据。 工作原理 手机浏览器 │ HTTPS(任意网络:Cloudflare Quick Tunnel / localhost.run)或 HTTP(同一 Wi‑Fi) ▼ 认证网关(本插件,独立端口) 配对、设备 cookie、来源检查、限速 │ 回环地址,换用宿主凭据 ▼ DSH Host 的 Web 服务 /api/remote.mux(WebSocket)、/plugins/*、文件接口 - 手机界面是随插件发布的独立前端:它启动宿主的客户端服务来读写会话和设置,界面本身由插件渲染。 - Cloudflare Quick Tunnel 不支持 SSE,远程引导脚本把宿主的 /plugins/events 事件流改由 WebSocket 传输,保留事件顺序、Last-Event-ID 和重连。 - 第三方插件的设置页通过兼容容器显示,依赖 DSH 0.2.0-rc.2 的内部渲染接口;宿主升级改变该接口时,对应页面会提示不可用,其余功能不受影响。 更多细节见 功能对应清单、验证记录、调研记录 和 UI 规格。 开发 pnpm install pnpm typecheck pnpm test # vitest:网关、配对、宿主集成 pnpm build node scripts/check-package.mjs # 检查打包内容 pnpm qa:host 在仓库的 .qa/ 目录里启动一个隔离的 DSH Web profile,不触碰日常使用的 DSH 配置;pnpm qa:browser 用本机 Chrome 跑完整回归(配对、会话、文件、设置、撤销)。回归使用的测试模型只返回固定内容,不发出外部请求。 本地联调:DSH 桌面版「添加插件」里填本仓库目录路径(以 link 方式安装),pnpm build 后重启 DSH 生效。 致谢 实现时参考了 dsh-remote-web-ui、DSH Remote 和 untun。本项目为独立实现,不使用这些项目作者的中继服务。 许可证 MIT
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
copylee711/dsh-remote-control
扫码配对后,用手机浏览器接管电脑上的会话与设置
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1