DSH Plugin MarketA community catalog for DeepSeek Harness plugins

dsh-remote-ssh

Verified Tools & capabilities ★ 3 1.0.3

Remote SSH for DSH: browse remote files, open remote terminals, and mirror local agent edits to a remote server with per-mapping sync direction.

What it is

Remote SSH for DSH: browse remote files, open remote terminals, and mirror local agent edits to a remote server with per-mapping sync direction.

How to install

Run this in the DSH web profile, then refresh the page.

$ dsh plugin --profile web add dsh-remote-ssh@1.0.3

DSH versions accepted

>=0.2.0-rc.2

Author and traction

LinHao100076 · ★ 3 · Updated 2026-11-10

About this plugin

dsh-remote-ssh

DSH(DeepSeek Harness)的远程 SSH 插件:在侧边栏里看远端文件系统、开远端终端、把远端服务映射到本机,本地改动自动上传、远端文件可下载,并与 dsh-better-sidebar 联动。

当前版本 0.7.3 —— 没有密钥也能连,隔几层堡垒机也能连;新装的人第一次就能建连接。0.4.0 加远端内容搜索,0.5.0 加断点续传,0.6.0 补上 socks5 动态转发与 -R 反向转发,0.6.1 修掉「Node 20 上整份宿主端 bundle 加载即抛」的问题,0.7.0 补上密码 / keyboard-interactive(2FA)登录与多跳跳板链路,0.7.1 修掉「一台主机都没有时新建按钮点了没反应」,Node 20 / 22 / 24 都跑过。更早的版本在 Release 上都标为 beta,各自坏在哪、后来被哪个版本修掉,写在对应 Release 的说明里。完整变更见 [CHANGELOG](CHANGELOG.md),下一步见 [ROADMAP](ROADMAP.md)。

0.7.2 修复

当前源码补上文件覆盖与自动同步的边界保护:传输不完整、源文件变化或重命名失败时保留已有目标;上传期间再次保存会补传最新版本,暂停/删除映射会取消旧任务。相对映射路径按会话目录解析,下载不能越过本地映射目录,include 支持子目录文件。下载基线分别记录两端时间,快速编辑也参与冲突检测。

覆盖文件优先使用 OpenSSH 原子 rename;不支持覆盖 rename 的 SFTP 服务器会返回错误,不再先删除旧文件。手动“全部上传”仍是显式覆盖操作,不经过自动同步的逐文件冲突判断。新增安全与真实 watcher 回归测试已纳入 npm test,详见 [CHANGELOG](CHANGELOG.md)。

界面按钮补上新建入口、设置页验证码、保存指纹、文件下载与搜索状态的回归;终端退出后可重连,新建终端标签对应独立 tmux 会话。浏览器交互测试使用实际客户端构建产物与隔离 API fixture,单独执行 npx playwright install chromium、npm run test:ui,不需要真实服务器。它验证界面行为和请求参数,不能替代真实 DSH/SSH 环境验收。

0.7.3 文件页与终端改进

桌面版升级后请完全退出并重新启动应用,确保已打开窗口加载新客户端;只关闭侧栏可能仍保留旧代码。

搜索按钮默认查找当前目录及子目录中的文件名,按名称包含关键词匹配;可切换“文件内容”使用原来的内容搜索和正则。文件名结果显示路径,点击打开预览。文件名模式使用 Ubuntu 的 find 和支持 -z 的 head,不读取文件内容。终端删除“清屏/粘贴”两个按钮,保留终端键盘操作。

目录单击展开、双击进入;面包屑及“上传位置”显示当前目录,上传始终写入选文件时的该目录。新建目录使用页面内表单,兼容桌面版;再次点击已选文件、点击目录/列表空白或“隐藏预览”可关闭文件内容,迟到的读取不会重新打开预览。

上传按 256 KB 分块,不再将整个 20 MB 文件塞进 JSON 请求;全部接收并检查大小后才发布,取消、失败或未完成上传保留原目标。上传中可取消,最终发布阶段不可取消;空闲 15 分钟的任务自动清理。进程或连接异常断开可能留下 .dsh-tmp-* 临时文件。

下载可直接填写本地绝对路径(含文件名),例如 C:/Downloads/report.zip,无需映射;“下载到映射目录”仍可选。这里的本地是 DSH 宿主所在电脑:桌面版就是当前电脑,远程 Web 部署则是运行 DSH 的服务器。下载会覆盖选定路径上的同名文件,请确认路径。

回到文件页时立即刷新;文件页可见时每 4 秒刷新当前目录和已展开子目录,因此同步上传或外部新增文件后无需手动刷新。自动刷新不会重置预览中的编辑内容。

经主机 A 连接主机 B:转发还是跳板?

两者都能经过 A,但端口转发只提供 TCP 通道,不会自动创建 B 的 SSH 登录,也不会代替 B 的认证。

  • 推荐用跳板链路:新建主机 B,填写 B 的内网地址、端口、用户及认证;在 B 的“跳板链路”里添加 A,填写 A 的 SSH 地址和认证。插件直接完成 本机 → A → B,文件与终端属于 B。
  • 也可以手动转发:先连接 A,在 A 的转发页添加“本地 -L”,监听 127.0.0.1:2222,目标填 A 能访问的 B 内网地址和 SSH 端口(通常 22)。启动后,再新建主机 B,地址填 127.0.0.1、端口填 2222,用户及认证填写 B 的。A 的连接和转发必须保持运行。这种方式能不配置跳板字段,但仍需登录 B;仅新建 A 的转发不等于已经连接 B。

| 方式 | 监听端 | 目标从哪里访问 | 适用用途 |

| --- | --- | --- | --- |

| 本地 -L | DSH 宿主电脑 | SSH 主机(例如 A) | 访问 A 能到达的 B:22、数据库或 Web 服务 |

| 动态 -D | DSH 宿主电脑的 SOCKS5 端口 | SSH 主机 | 支持 SOCKS5 的程序访问多个内网目标;插件不会自动把它当跳板 |

| 反向 -R | SSH 主机 | DSH 宿主电脑 | 让服务器侧访问宿主侧服务 |

| 跳板链路 | 无需额外固定监听端口 | 前一跳到下一跳 | 登录内网 B,直接使用 B 的文件和终端 |

远程 Web 部署时,上表“宿主电脑”是运行 DSH 的服务器,不是打开网页的电脑。

文档

| 文件 | 内容 |

| --- | --- |

| [CONTRIBUTING.md](CONTRIBUTING.md) | 开发环境、分支与提交约定、测试底线、PR 前自查 |

| [SECURITY.md](SECURITY.md) | 安全模型(凭据怎么存)、已知风险面、私密报告渠道 |

| [ROADMAP.md](ROADMAP.md) | 打算做什么、明确不做什么 |

| [CHANGELOG.md](CHANGELOG.md) | 每个版本改了什么 |

| [docs/design.md](docs/design.md) | 架构取舍的长文档:为什么不做某些事、踩过的坑 |

| [ui/prototype.html](ui/prototype.html) | 界面基准,单文件可直接打开 |

两个入口(better-sidebar 是可选的)

| 装了什么 | 出现在哪 | 怎么打开 |

| --- | --- | --- |

| 有 dsh-better-sidebar | better-sidebar 的侧栏,一个名为「远程 SSH」的标签页 | 侧栏里点「远程 SSH」 |

| 没有 / 停用了 dsh-better-sidebar | DSH 自带的右侧边栏,同一个「远程 SSH」面板 | 会话头部右上角的服务器图标按钮 |

无论走哪条路,面板都是同一个组件:主机头 + 一条标签条(文件 / 终端 / 同步 / 转发 / 设置)+ 状态栏。早先版本在 better-sidebar 里注册了四个标签页,把侧栏挤得很满,v0.3.0 起统一成一个(见 issue #1)。

两条路径互斥:如果 better-sidebar 在启动后才激活,插件会把原生入口撤掉、换成同一个标签页,不会同时出现两个入口。

目录

src/               宿主端:HTTP API、WebSocket 终端、SSH 连接池、文件/传输/同步、端口转发
client/            浏览器端:一个 Workspace 面板 + 五个视图 + 两个入口(better-sidebar 标签页 / 原生右侧边栏)
lib/client.js      构建产物:客户端 bundle(esbuild 打包,由宿主按插件名提供)
lib/server.mjs     构建产物:宿主端 bundle(ssh2 / ws / chokidar 全打进来,包里零运行期依赖)
docs/design.md     架构取舍、平台发现、问题清单、里程碑
docs/assets/       README 用的面板截图(由 ui/prototype.html 生成)
ui/prototype.html  UI 原型(单文件,浏览器直接打开,可切深色)——界面以它为准
test/              十九轮测试(见下)
scripts/           对着真实服务器跑的验收脚本;`dev-remote.mjs` 是本地假远端(exec 走真 shell,SFTP 只读)
.github/           issue / PR 模板、CI(Node 20 / 22 / 24 各跑一遍十九轮测试)、dependabot
.gitleaks.toml     秘密扫描配置:只放行 ssh2 那段 Ed25519 探针密钥(见 SECURITY.md)

先看原型

双击 ui/prototype.html。顶栏可切换界面状态:连接页 / 新建连接 / 连接中 / 文件 / 终端 / 同步 / 设置 / 错误。

也支持 ?view=new、?view=terminal 等直达链接(旧的 ?view=jump 仍然可用,会落到设置里展开的跳板块)。

> 原型里没有「转发」视图 —— 端口转发晚于原型(v0.2.0),那一屏是照着原型的 token 与栅格补的,没有回填进原型。改转发界面时以 client/forward-view.jsx 和 client/styles.js 为准。

> 「新建连接」与「设置」里的跳板链路和密码 / 2FA 认证已经是实现,不再是设计稿:密码登录、只开 PasswordAuthentication 的服务器、要 OTP 的 keyboard-interactive 都能用(docs/design.md §8.16、§8.17);跳板可以配多跳,一串卡片按流量顺序排(第 1 跳 → 第 2 跳 → 目标机),每跳带自己的端口、账号与认证方式,摘要行写着 2 跳 bastion-a:22 → bastion-b:2222。~/.ssh/config 的 ProxyJump a,b 会展开成两跳。跳板不是独立页面:它是「这台主机怎么连」的一部分,和主机参数共用同一个表单 —— 给它一个顶级入口等于让同一件事有两个真值来源。

面板按原型的 424px 设计,宽度跟着右侧栏走;原型里的深色版本通过 light-dark() 复用同一套 token,自动跟随 DSH 的主题。

Compare in this category

The five most-starred plugins in the same category.

PluginAuthor StarsVersionUpdated
Mole tw93 74.5K 0.0.0 2026-11-10
DeepSeek-Reasonix esengine 36.1K 0.0.0 2026-11-10
dsh-desktop anywhere-labs 35.6K 0.4.1 2026-11-06
awesome-dsh-plugin awesome-dsh-plugin 24.1K 0.1.0 2026-11-10
dsh-market dsh-market 11.8K 1.73.17 2026-11-09