dsh-ssh-manage
SSH host manager for DeepSeek Harness: browse ~/.ssh/config, store AES-256-GCM encrypted passwords, run batch commands and SFTP, and open interactive PTY terminals in persistent sidebar tabs.
Install
dsh plugin --profile web add dsh-ssh-manage
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
<div align="center">
<img src="icon.svg" width="96" height="96" alt="SSH Manager icon" />
dsh-ssh-manage
在 DSH 侧边栏管理 SSH 主机,并直接打开真正的交互式终端。





中文 | [English](README.en.md)
</div>
这是什么
dsh-ssh-manage 是 DeepSeek Harness (DSH) 的 Web 插件。它把 ~/.ssh/config 里的主机变成 DSH 侧边栏里可管理、可连接、可运维的对象:
- 主机管理:扫描配置、分组、标签、收藏、备注、连接延迟、主机巡检、一键健康检查(在线/离线/延迟)、可选 5 分钟定时检查与离线告警、按主机保存快捷命令并一键执行;SSH 别名全局唯一,不同分组如需同名请使用可重复的“显示名称”;
- DSH Agent 集成:向 DSH 系统提示注入精简主机目录(别名/分组/显示名),地址等详情由
list_hosts按需获取以控制 token;Agent 可直接用ssh_manager执行命令、批量命令、巡检和 SFTP 操作;支持 DSH 斜杠命令/ssh <alias> <command>直接执行、/ssh列出主机;Agent 还可通过terminal_list/read/send/close共享用户已打开的交互式 PTY 会话; - Agent 安全:设置页可开启只读模式;危险操作可选“执行前询问”走 DSH 审批;exec、批量命令、SFTP 写操作和主机变更会写入本地审计日志(自动脱敏命令中的密码/token);
- 交互式终端:ssh2 分配 PTY,xterm.js 渲染,支持彩色输出、方向键、
vim/top等全屏程序和窗口自适应; - 备份迁移:设置页可导出/导入主机、分组、标签、备注、收藏和密码;导出文件用自定义口令二次加密(scrypt + AES-256-GCM),导入按别名合并;
- 端口转发:主机详情启动
127.0.0.1:本地端口 → 远程主机:端口本地转发或本地 SOCKS5 代理,支持 ProxyJump/密钥,插件卸载时自动关闭; - 日常运维:批量命令、SFTP 目录浏览 / 新建 / 重命名 / 删除 / 上传 / 下载 / 远程文本编辑、传输队列与覆盖确认、真实上传进度与取消、测试连接;
- 凭据管理:每台主机保存一份 AES-256-GCM 加密密码,不写进
~/.ssh/config;默认不返回浏览器,在主机详情点“显示密码”时才按需解密到当前页面,30 秒后自动隐藏; - Agent 工具:
ssh_manager把同一套能力开放给模型。
不用再在终端和 DSH 之间来回切换,也不用记每个主机在配置文件里的位置。
特性
主机管理
- 左侧分组树 + 右侧主机表格:搜索、按分组筛选、收藏、标签、备注、连接状态与延迟一目了然;分组栏可拖拽调整宽度(双击恢复默认),宽度会记住。
- 新建、编辑、重命名、删除主机;重命名自动迁移分组、标签、收藏、备注、巡检信息和已保存密码。
- 表格列可配置(信息列 / 备注列 / 紧凑行高),窄屏自适应。
- 主机详情抽屉:地址、用户、端口、分组、标签、备注、发行版、CPU、内存、磁盘、延迟,以及「测试连接」「巡检」。
- 所有写操作先备份、再临时文件 + 原子重命名;解析失败时拒绝写入,不覆盖原配置。
- 只更新受管字段(
Host、HostName、User、Port、IdentityFile、ProxyJump、ForwardAgent);Include、LocalForward、注释、空行和其它别名原样保留。
交互式终端
- 点「连接」打开真正的 PTY shell,不是一条命令一条命令地执行。
- 多台主机以标签页常驻:切换到其它 DSH 会话再回来,终端会重新附着到原来的 shell,并回放最近约 256 KB 输出;关闭标签、Host 退出,或 30 分钟无输出/输入/心跳才会结束会话。
- xterm.js 6.0.0 渲染,支持 256 色、光标、滚动回看、选中复制、粘贴、窗口 resize、终端内搜索、字号调整和右键复制/粘贴菜单。
- 终端主题跟随 DSH 明暗主题;会话顶部有地址、密码状态、测试连接、文件、详情、清屏、关闭等快捷操作。
- 输出走同源 HTTP/SSE 长连接,输入 / 尺寸 / 关闭走同源 HTTP POST;插件同时保留经过测试的 WebSocket 备用通道。
- 断线或后端未加载时显示明确的状态与「重新连接」,不会静默卡死。
批量命令与文件
- 批量命令:勾选多台主机,一次执行同一条命令,按主机汇总 stdout / stderr / 退出码。
- SFTP:在主机抽屉里浏览远程目录,新建文件夹、重命名、删除文件/空目录、上传(支持多选和覆盖确认)、下载、直接编辑远程文本文件并保存;会记住每台主机上次所在目录。
- 测试连接:记录连接延迟,结果写回主机信息。
- 主机巡检:读取发行版、CPU 核心数、内存、磁盘容量。
凭据与数据
- 密码使用 AES-256-GCM 加密保存在插件自己的状态目录,插件启动时自动解锁,不需要每次输入主密码,也不使用系统 Keychain。
- 密码只用于 SSH password authentication,同时兼容只提供 keyboard-interactive 的主机;不会写入
~/.ssh/config、命令参数或日志。默认不返回浏览器;仅在你主动点击“显示密码”时按需解密到当前页面,30 秒后自动隐藏,且不会通过 Agent 工具返回。 - 密码密文与本地密钥位于同一用户目录,主要防止文件被直接误读,不能抵御同一用户下的恶意进程。
- 主机分组、标签、收藏、备注、巡检结果保存在
hosts.json;密码保存在vault.json;删除/修改配置前写入备份目录。
主机密钥校验:连接会按known_hosts校验主机密钥(默认~/.ssh/known_hosts,可用SSH_KNOWN_HOSTS指向其它文件)。首次连接或服务器密钥变更时会拒绝连接,错误信息包含服务器SHA256:指纹、期望指纹和 known_hosts 路径;请先通过可信渠道核对指纹;首次连接可直接在终端错误页点“信任主机密钥并重连”(会再次确认),也可手动写入 known_hosts。密钥变更不会被一键信任,需先核对并移除旧条目。DSH_SSH_MANAGER_INSECURE_HOSTKEY=1会完全关闭校验,仅限紧急排障,不要长期使用。
Agent 工具
ssh_manager 工具开放以下动作,和页面走同一套 Host 逻辑:
overview、list_hosts、save_host、delete_host、set_metadata、save_password、delete_password、test_connection、inspect_host、exec、batch_exec、sftp_list、sftp_upload、sftp_download、sftp_mkdir、sftp_rename、sftp_delete。
密码字段是 write-only,任何返回值都不包含密码明文。
其它
- 深色 / 浅色主题、窄屏布局,全部使用 DSH 主题 token。
- 读取
~/.ssh/config中的非通配符Host条目;Include及其它指令原样保留(不会展开Include内定义的主机)。 - 所有 Host 路由、PTY 路由、静态资源路由都经过 DSH 的
connection.requestRejection鉴权,未认证请求返回 401。 - 不向第三方服务发送任何主机或终端数据。
使用
左侧栏 →「SSH 主机」:
标签页 · 用途
主机 · 分组树 + 主机表格;点「连接」进入终端,点行打开详情/文件抽屉。
会话 · 已打开的终端标签页;可切换、清屏、重连、关闭。
批量命令 · 勾选主机后执行同一条命令,查看汇总结果。
设置 · 配置文件、备份目录、状态目录、凭据数量、列显示、紧凑行高。
新建主机必填:别名、服务器地址、密码。密码不会写入 ~/.ssh/config。
安装
从 npm 安装(推荐)
npm 包:dsh-ssh-manage(当前版本 0.3.25)。
plugin_manager action=install_bundle target=dsh-ssh-manage@0.3.25
或使用 DSH CLI:
dsh plugin add dsh-ssh-manage@0.3.25
安装后刷新 Web 页面,左侧栏会出现「SSH 主机」入口,入口 id 为 dsh-ssh-manage。
从旧名dsh-ssh-manager迁移:包名、插件 id、路由前缀已改为dsh-ssh-manage,但状态目录仍保留~/.dsh/.ssh-manager/,已保存的主机、密码和元数据不会丢失。
本地开发安装
把仓库目录 link 进 DSH profile,改代码即时生效(Host 侧改动仍需重启 DSH):
plugin_manager action=install_bundle target=<仓库绝对路径>/dsh-ssh-manage
手动
在 profile 的 cordis.patch.yml 中加入:
- insert:
- id: dsh-ssh-manage
name: 'dsh-ssh-manage'
config: {}
并确保包可被 profile 解析(例如 link: 到本地目录)。
兼容性
· 要求
DSH · >=0.2.1-rc.3 <0.3.0(实机验证版本:DSH Desktop 0.2.1-rc.3)
Node.js · >=20(跟随 DSH 内置运行时)
平台 · 实机验证 macOS;测试套件只依赖 Node 内置模块,可跨平台运行
网络 · 需要能访问目标 SSH 主机的 22 端口(或配置的端口)
package.json声明了engines.dsh;DSH 在安装/启动前会做兼容性检查,不满足时阻止加载并提示。- 用到的 DSH 扩展点:
sidebar.panellist/main槽位、ctx.locale、ctx.webServer.register、ctx.webServer.registerUpgrade、ctx.webServer.tapIndex、ctx.tools.register、connection.requestRejection。 - Host 侧在激活时会检查
webServer.register是否存在,缺失时抛出明确错误。 - 安装或更新插件后,Host 侧的终端传输路由(HTTP/SSE 与备用 WebSocket)和静态资源路由需要重启 DSH 才会生效;仅刷新页面只会更新浏览器端代码。
架构
┌───────────────────────────── 浏览器 ─────────────────────────────┐ │ client.js │ │ sidebar.panellist 入口 + main 面板(主机/会话/批量/设置) │ │ xterm.js 终端 · React(module table)· ctx.slots / ctx …(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::32,最后更新 2026-10-29