dsh-remote-ssh
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.
| Plugin | Author | Stars | Version | Updated |
|---|---|---|---|---|
| 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 |