跳到主内容

dsh-Remote

19Star2Fork5Issue0Watching

DSH 远程控制台:插件 + 内置网关 + Android 应用,支持手机/桌面查看会话、传输文件、Token 统计与远程启停 DSH。

机审证据4/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
main
deepseek-harnessdshdsh-pluginmobileremote-control

安装

命令web profile
$ dsh plugin --profile web add dsh-remote

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 Blank-not-black/dsh-Remote:先查看仓库 https://github.com/Blank-not-black/dsh-Remote 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

DSH 远程控制台:DSH 插件 + 内置网关 + 桌面 WebUI + Android 应用,让你在手机或另一台电脑上查看会话、处理审批、传输文件,并远程启停本机 DSH。

核心能力

  • 在 DSH Web 侧栏底部新增 "DSH Remote" 入口,弹出抽屉式快速面板并可打开完整管理控制台(含网关状态、设备监控、Token 统计、二维码配对、令牌轮换)
  • 内置远程网关随 DSH 自动启停(默认 0.0.0.0:8787),由 systemd-run 优先拉起为独立用户单元,回退 detached 子进程;DSH 重启 / 网关异常退出后自动拉起
  • 提供手机端(Android 应用 + 同源 WebUI)、桌面 WebUI 和管理控制台三种远程入口,共享会话、文件、统计、设置和工作台绑定视图
  • 通过 WebSocket 实时转发 DSH 的下行事件流(mux / host 两个集中 collector),客户端断网自动降级到轮询,恢复后切回 WS
  • 完整 /fs/* 文件端点:列表、下载、分块 / 断点续传上传、暂停 / 继续 / 取消、SHA-256 校验落位;支持文件预览(白名单文本 / 代码扩展名)
  • 远程启停本机 DSH:通过 systemd 异步追踪服务检查 / 命令提交 / 进程启动 / HTTP 恢复 / 实时通道重连五阶段,失败给出细分错误码

技术实现

  • 语言: Node.js(ESM 插件 + CommonJS 单文件网关)+ 零依赖纯 JS WebUI + Java(Android Capacitor 8 壳)
  • 关键依赖: node:http / node:https / node:child_process / node:fs / node:crypto(运行时零第三方依赖);Cordis SDK(@deepseek-ai/dsh-client-runtime + @deepseek-ai/dsh-client-ui-slots,由 dsh.client.inject 注入);Capacitor 8(仅 Android 端构建时依赖)
  • 架构模式: 双半区 cordis bundle + 单文件网关 + Capacitor Android 壳。Host 半区 packages/plugin/index.mjs(inject=['webServer','commands','agents'])在 DSH Web 的 httpServer 挂 /remote 前缀路由,内置 gateway.cjs 随 DSH 自动启停,并通过 ctx.on('session/event') 把带 usage 的 assistant/message 投递到网关 /stats/ingest 做 Token 聚合;Client 半区 packages/plugin/client.js(inject=['slots'])注册 sidebar.footer.action + shell.overlay 两个 slot 嵌出抽屉和按钮;网关 gateway.js 维持两个集中 WebSocket collector 与 DSH 上游单条连接,下行帧多客户端共享 + 连接新加入重放 session 基线 + 待处理请求
  • 入口文件: packages/plugin/index.mjs(host 入口,export const name='dsh-remote' + apply 挂路由 / 监听 / 自愈)、packages/plugin/client.js(client 入口,注册侧栏按钮和 iframe 抽屉)、gateway.js(单文件网关,HTTP + WebSocket + /fs/* + /admin/api/* + /stats/* + /remote/* 代理)

适用场景

  • DSH 装在主力机上,希望通勤或会议中用手机继续看会话、回复提问、处理工具审批,而不需要远程桌面。
  • 需要在手机与 DSH 工作目录之间互传文件,或者把手机相册 / 拍照的图片直接发到当前会话作为图片附件。
  • 需要从另一台电脑通过浏览器进入 DSH 的桌面布局(左侧会话 + 工作台、文件、统计、设置),并查看 Token 用量、设备连接和网关运行状态。
  • 希望从手机远程启动 / 重启本机 DSH(systemd 用户服务场景),而不是坐到电脑前敲命令。

前置依赖与兼容性

依赖最低版本说明
DSH未声明通过 dsh.bundle.patch + dsh.client.inject 接入;插件侧依赖 ctx.webServer / ctx.commands / ctx.agents 三个服务;网关侧默认反代 http://127.0.0.1:3080(DSH_UPSTREAM 与 DSH_HEALTH_PATH 可覆盖)
Node>=18来自 packages/plugin/package.json:44-46;单文件网关产物打包目标 node22-linux-x64 / node22-win-x64 / node22-macos-arm64
平台Linux / Windows / macOSLinux 与 Windows 给出单文件网关;macOS Apple Silicon 标记为独立预览产物未承诺与主版本同步(README.md:135-138)
原生模块无运行时零第三方依赖;Android 端额外依赖 Capacitor 8(@capacitor/core / android / app / camera / local-notifications,构建时)
systemd仅 Linux远程启动 / 重启 DSH 走 systemctl --user,Windows 暂不支持(返回 PLATFORM_UNSUPPORTED)

安装方式

dsh plugin --profile web add github:Blank-not-black/dsh-Remote

配置项

配置类型说明默认值
DSH_REMOTE_GATEWAY_PORT环境变量网关监听端口,覆盖文件与默认8787
~/.dsh-remote/gateway-port文件写入单个端口数字即生效,端口优先级仅次于环境变量未设置时默认 8787
DSH_REMOTE_AUTOSTART环境变量设为 0 彻底禁用插件自动管理网关(连启动 / 重启都不做)未设置(默认启用自愈)
~/.dsh-remote/gateway.enabled文件on / off,插件面板"启动 / 停止网关"按钮会写入此文件未设置时默认 on
DSH_REMOTE_GATEWAY环境变量让插件侧面板代理到外部网关地址(绕过本机自起)未设置(指向本机端口)
DSH_REMOTE_TOKEN / TOKEN_FILE环境变量覆盖令牌文件位置;TOKEN 直接提供令牌(环境变量下不能走"轮换令牌")~/.dsh-remote/token,首次启动自动生成 24 字节 base64url
DSH_REMOTE_FS_ROOT环境变量允许访问的额外目录根,Linux / macOS 用 : 分隔,Windows 用 ;~(用户主目录)+ DSH 已登记工作区自动放行
DSH_REMOTE_FS_MAX_UPLOAD环境变量单文件上传字节上限2147483648(2GB)
DSH_REMOTE_FS_WORKSPACE_CACHE_MS环境变量DSH 工作区列表缓存时间,避免每次文件请求都打 DSH15000
DSH_REMOTE_ANNOUNCEMENTS_URL环境变量中央公告源 HTTPS 地址,设为空字符串彻底禁用中央源https://vm-0-2-ubuntu.tail1f6fc4.ts.net/announcements.json
DSH_REMOTE_ANNOUNCEMENTS_FILE环境变量中央源不可达时的内置公告文件路径<plugin>/public/announcements.json
DSH_REMOTE_DSH_SERVICE环境变量远程启停 DSH 时使用的 systemd 用户服务名dsh-web
DSH_REMOTE_SYSTEMCTL环境变量systemctl 二进制路径systemctl
DSH_REMOTE_DSH_CONTROL_TIMEOUT_MS环境变量远程启停 DSH 单次命令限时(毫秒)45000
DSH_REMOTE_DSH_CONTROL_POLL_MS环境变量远程启停 DSH 阶段间轮询间隔(毫秒)500
DSH_REMOTE_FEEDBACK_URL环境变量用户反馈提交端点https://vm-0-2-ubuntu.tail1f6fc4.ts.net/submit
DSH_REMOTE_NOTES / DSH_REMOTE_WORKBENCH环境变量设备备注与工作台绑定 JSON 文件路径~/.dsh-remote/device-notes.json / ~/.dsh-remote/workbench.json
DSH_REMOTE_CORS_ORIGINS环境变量额外允许的跨域来源,逗号分隔;* 放行全部未设置(默认仅同源、Capacitor / ionic / localhost)
DSH_UPSTREAM环境变量网关要反代的 DSH Web 地址http://127.0.0.1:3080
DSH_HEALTH_PATH环境变量网关 /health 用来探测上游可达性的路径/
GATEWAY_WS_PING_MS / GATEWAY_WS_PONG_TIMEOUT_MS / GATEWAY_WS_IDLE_MS / GATEWAY_WS_UPGRADE_TIMEOUT_MS / GATEWAY_WS_TICKET_TTL_MS环境变量WebSocket 心跳 / 等待 / 空闲 / 升级超时 / 短时 ticket TTL(毫秒)30000 / 90000 / 180000 / 15000 / 90000
UPDATE_CHECK_URL / UPDATE_INTERVAL_MS / UPDATE_PROXY环境变量更新检查 GitHub API、检查间隔、更新请求代理GitHub 官方 API / 6 小时 / 透传 HTTPS_PROXY 等

常见问题

Q: 这个插件能做什么?

A: 在 DSH 侧栏加 "DSH Remote" 入口,打开抽屉式快速面板和完整管理控制台;内置一个会随 DSH 自动启停的远程网关,让你在手机 App、桌面浏览器或另一台电脑上查看会话、处理审批、传输文件,并远程启动 / 重启 / 关闭本机 DSH;附带 Token 用量统计与峰谷计费提醒。

Q: 安装后需要做什么才能用?

A: 装到 web profile 后完整重启 DSH Web(systemctl --user restart dsh-web 或手动停掉再启动),再 Ctrl+F5 强刷浏览器;先在 DSH 主机上访问 http://127.0.0.1:8787/health 看到 JSON 即说明网关已起来。手机装好 APK 后在"设置 → 服务器"扫码或手填主机局域网 IP + 令牌即可连上。手机端不要填 127.0.0.1 或 localhost,它们指向手机自己。

Q: 必须装插件吗?能不能单独跑网关?

A: 可以。仓库附带 gateway.js 单文件网关(Node 零依赖),可用 pkg 打包为 Linux / Windows 单文件;不安装插件也可用 ./dsh-remote-linux-x64 直接运行,手机 / 桌面端访问 http://主机IP:8787 即可。

Q: 令牌放在哪里?怎么轮换?

A: 默认在 ~/.dsh-remote/token(mode 0600),首次启动自动生成;环境变量 TOKEN / TOKEN_FILE / DSH_REMOTE_TOKEN 可覆盖。管理控制台点"轮换令牌"会立即写新令牌并踢掉所有已连接设备,旧连接全部失效。令牌等同 DSH 远程操作凭证,请像保护 SSH 密钥一样保护它。

Q: 文件传输能传多大?能不能访问任意目录?

A: 默认单文件上限 2GB,由 DSH_REMOTE_FS_MAX_UPLOAD 调整;分块、断点续传、暂停 / 继续 / 取消、SHA-256 校验落位都支持。默认根目录为 ~,DSH 已登记工作区自动放行;其他目录用 DSH_REMOTE_FS_ROOT(Linux / macOS 用 :,Windows 用 ;)添加。../ 路径穿越、绝对路径逃逸和指向允许根外的符号链接会被拒绝。

Q: 实时消息断网了怎么办?

A: 客户端通过 /api/events.mux 和 /api/events.host 两个 WebSocket 通道走 DSH 下行-only 协议;用 1.5s 起、60s 上限的指数退避重连 + 20% 抖动,单通道连续失败 3 次自动降级到 4s 一次的 /api/events.poll 轮询,30s 后尝试恢复 WS。

Q: 公告和峰谷提醒怎么工作?

A: 公告从默认 HTTPS 中央源拉取,App 前台每 30 秒检查、网关缓存 15 秒;中央源失败优先保留上次成功内容,冷启动失败回退内置文件;DSH_REMOTE_ANNOUNCEMENTS_URL 可覆盖、设为空字符串可禁用。峰谷计费提醒仅在 Android App 内有效,由 PeakReminderService 前台服务驱动(30s 检查 9 / 12 / 14 / 18 点切换,周末全天按谷时仅 9 点提醒一次),绕开 MIUI / HyperOS 后台限制。

上手难度

入门 — 安装命令一行,安装后重启 DSH Web 即可在侧栏看到入口;从本机到局域网再到 Tailscale 的每一步都有插件面板提示与一键开关,普通用户按提示走就能跑通;自定义端口、文件根目录、DSH systemd 服务名等需要在插件面板或环境变量里改,普通用户基本无需关心。

已知问题与限制

  • macOS 苹果芯片只有预览产物:仓库仅发布 node22-linux-x64 与 node22-win-x64 单文件网关(package.json:25-28),macOS arm64 标记为"独立预览产物,未承诺与主版本同步"(README.md:135-138)
  • Windows 不支持远程启停 DSH:仅 Linux 通过 systemd 控制 DSH;Windows 调用 /admin/api/dsh 直接返回 PLATFORM_UNSUPPORTED(gateway.js:603)
  • DSH 工作区 root 之外的目录必须显式声明:默认只放行 ~ 与 DSH workspace.list 返回的工作区;其他目录需用 DSH_REMOTE_FS_ROOT 显式添加(gateway.js:1750-1789、README.md:218-226)
  • 文件预览仅白名单扩展名且 ≤ 1MB:.txt / .md / .json / 代码类扩展名白名单内的纯文本可预览;超过 1MB、二进制文件、其他扩展名都会被拒(gateway.js:182-189、1966-1976)
  • Android 后台轮询会被 Doze 拉长:灭屏后系统会冻结后台任务,实际轮询间隔可能拉长;部分 ROM 还需用户手动允许自启动 / 后台运行 / 不受限电量(android/.../RemotePollService.java:31-32)
  • 部分原生能力仅在新版 App 内可用:手机下载 / App 内安装 / 扫码 / 图片解码等走 Capacitor 原生插件,旧 App 版本会回退到浏览器(public/index.html:863-885)
  • 自定义公告源必须 HTTPS:DSH_REMOTE_ANNOUNCEMENTS_URL 强制 HTTPS,仅测试场景允许 localhost HTTP(README.md:294)
  • README 文档先行:README.md:250 提到 /health 返回 protocol.version 与 capabilities 用于 App 按能力选择握手路径,但当前 serveHealth 实现(gateway.js:2693-2706)未暴露这两个字段;旧 App 仍按兼容路径尝试,不会因此拒绝连接

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/Blank-not-black/dsh-Remote)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录