中文 · English
【DeepSeek Harness (DSH) 的 SSH 工作区 + SSH 运维插件】
在 DSH Web GUI 中管理若干台 SSH 服务器,把服务器上的任意目录变成 SSH 工作区:绑定后,会话内的文件读写、命令执行透明路由到远端主机,你(以及 agent)就像在本机一样操作——同时保留完整的 SSH 运维面板(终端、传输、隧道、集群、主机管理)。
- SSH 工作区:任意
user@host的目录即可成为工作区。绑定后该会话的fs/subprocess经过 seam 自动落到远端(SFTP 读写、远端 bash),本地会话不受影响。 - SSH 运维:侧边栏「SSH」面板 —— Web 终端(xterm + WebSocket PTY)、文件上传下载(SFTP)、本地端口隧道(访问内网数据库/服务)、集群并发执行、主机增删改查与
~/.ssh/config导入、连接测试。 - Agent 工具:
ssh_list/ssh_exec/ssh_upload/ssh_download/ssh_tunnel/ssh_cluster,以及remote_*工作区工具,供 agent 直接操作远端。 - 安全默认值(VSCode Remote-SSH 式):密码/密钥口令默认不落盘(
secretStorage: none);首次连接或浏览远端目录时弹窗输入一次,会话内复用;需要无人值守时可显式启用vault加密存储。主机密钥采用 TOFU 校验(首次指纹确认,变更即告警,防中间人)。 - 通用底座:工作区管理底层(WorkspaceLedger / Provider / Registry / Router / WFS)与 SSH 解耦,其他插件可复用同样的「本地/远端工作区」模型。
- 多服务器:任意数量的主机(
host/port/user+ 私钥或密码或SSH_AUTH_SOCKagent),密码免提交、连接时输入。 - SSH 工作区:添加工作区 → 选主机 → 浏览远端目录(可边浏览边选中)→ 命名创建;绑定的会话透明远端路由,侧边栏工作区带服务器标识(已连接蓝色、未连接灰色,悬停显示远端目录)。
- Web 终端:xterm + WebSocket PTY,与连接池复用(空闲 30 分钟自动断开)。
- 文件传输 / 隧道 / 集群:SFTP 上传下载、本地端口转发(
127.0.0.1)、多主机并发命令。 - 主机管理:新建/编辑/删除(删除受「仍有工作区」保护)、
~/.ssh/config导入、一键测试连接。 - 安全:
- 凭据策略
secretStorage:none(默认,VSCode 式,密码仅会话内存)或vault(AES-256-GCM + scrypt 加密存储,供无人值守 agent)。 - 主机密钥 TOFU:
~/.dsh/ssh-known-hosts.json,首次连接弹指纹确认,密钥变更弹「重置/信任」。 - 会话密码表:连接、测试、浏览目录时若缺密码,弹窗输入一次后会话内复用;进程重启后重新输入。
- 凭据策略
- 数据位置:主机配置
~/.dsh/dsh-ssh.json;工作区台账与锚点~/.dsh/ssh-workspaces;以上文件按系统权限(0600)落盘。 - 不修改官方内核:只作为普通插件挂载(目录流、会话头按钮、侧边栏入口),
dsh-workspace内核原样工作。
已发布到 npm(0.1.2,含插件所需的 cordis.patch.yml 与构建产物),一行安装:
dsh plugin --profile web add @tiphareth/dsh-hardssh
# 或 npx 形式(dsh 不在 PATH 时)
npx --yes @deepseek-ai/dsh plugin --profile web add @tiphareth/dsh-hardssh开发/迭代用本机源码或本地 tarball:
dsh plugin --profile web add C:/Users/Kether/.dsh/dsh-hardssh/dist/tiphareth-dsh-hardssh-0.1.2.tgz
# 或源码链接(改代码重建 lib/ 后重启即生效,无需重新打包)
dsh plugin --profile web add link:C:/Users/Kether/.dsh/dsh-hardssh/packages/dsh-hardsshNPM 包页面:https://www.npmjs.com/package/@tiphareth/dsh-hardssh
或手工方式:把包加入 profile 的 dependencies(file:... 指向 tarball)与
dsh.profile.bundles 列表,重启 dsh web 生效。
要求:dsh 内核
>= 0.1.2-alpha.3(插件针对该版本 API 适配)。
- 添加主机:SSH 面板 → 新建服务器,填别名/主机/端口/用户名——密码可留空(新增不会连接,首次使用时再输入)。
- 添加 SSH 工作区:侧边栏「添加工作区」→ SSH 工作区 → 选服务器 → 浏览远端目录(首次会自动弹出连接:未信任则先确认主机指纹,随后输入一次密码)→ 命名创建。
- 开始操作:在工作区会话里读写文件、运行命令即是远端执行;侧边栏工作区出现远端目录标识。也可以在 SSH 面板开终端、传文件、开隧道、跑集群。
| Key | Type | Default | 含义 |
|---|---|---|---|
announceToAgent |
boolean | — | 是否向 agent 注入 SSH 系统提示与工具引导 |
enabled |
boolean | — | 插件总开关 |
secretStorage |
enum | none |
凭据策略:none = 密码不落盘、连接时输入(VSCode Remote-SSH 式);vault = 加密存储(供无人值守 agent) |
示例(cordis.patch.yml):
- id: hardssh
name: dsh-hardssh
config:
secretStorage: none # 或 vaultpnpm install
pnpm --filter @tiphareth/dsh-hardssh typecheck # 类型检查
pnpm --filter @tiphareth/dsh-hardssh exec vitest run # 测试
pnpm --filter @tiphareth/dsh-hardssh build # 构建(lib/ 产物)打包部署:pnpm --filter @tiphareth/dsh-hardssh pack --pack-destination dist,
将 tarball 装入 profile(pnpm add file:...)后重启 dsh web。
连接时要求输入密码 / 提示“需要密码” —— 安全默认不保存密码:首次连接、测试、浏览远端目录时会弹窗输入一次,本会话内复用;进程重启后重新输入。
主机密钥变化 / 提示可能中间人 —— 服务器重装或轮换密钥:SSH 面板 → 主机 → 测试触发指纹弹窗 → 「重置」后重新信任。
加了服务器但浏览目录失败 —— 确认该主机配置正确;首次浏览会先完成「信任指纹 + 输入密码」,之后即可浏览。
工作区点击无反应 —— 点击时会自动完成连接(指纹/密码弹窗);若仍失败,看行下横幅提示或到 SSH 面板「测试」查看原因。
密码存哪里 —— 默认不落盘;启用 secretStorage: vault 后加密存储于 ~/.dsh/dsh-ssh-vault.json。
插件持有主机凭据后,agent 可以以你的身份在远端执行命令。请只添加你信任的机器。
默认策略下密码不写入磁盘(仅在会话内存中存在);主机密钥采用 TOFU 首次信任。
如需无人值守自动化访问密码主机,再显式启用 vault 模式并妥善保管主密码。
BSD-3-Clause
见 CHANGELOG.md。