前言¶
在 DeepSeek Harness(DSH)里操作远程服务器时,通常会打开多个窗口或跳转到 SSH 客户端。频繁切换不仅打断对话流,也容易遗漏上下文。DSH SSH 插件把 SSH 终端和 SFTP 文件管理器直接嵌入到右侧栏,与主对话窗口并排显示,让聊天与运维可以同时进行。
插件定位¶
callay02/dsh-ssh 是一个社区维护的客户端插件,提供 SSH 终端、SFTP 文件管理和远程指标采集能力,支持多连接管理、交互式终端、Agent 工具集和主机密钥固定(TOFU)。包名 @local/dsh-ssh 是本地作用域,不发布到 npm。
核心功能¶
多连接管理¶
- 支持名称、主机、端口、用户名配置。
- 认证方式:密码、私钥、SSH Agent。
- 连接状态、错误信息与主机密钥指纹可见。
- 主机密钥首次连接固定,后续不匹配会拒绝连接。
右侧栏终端,对话不中断¶
- SSH 终端作为右侧栏标签页打开,左侧主对话保持可用。
- 侧栏收起后终端在 Host 进程继续运行,展开或刷新页面后自动恢复。
- 基于 xterm.js 的交互式终端,支持颜色、Ctrl 组合键、窗口 resize、滚动缓冲。
- 每个连接可开多个终端。
- 终端上方实时显示连接状态、下载/上传速率、CPU 与内存占用。
侧栏入口¶
- 右下角浮动 SSH 按钮。
- 右侧栏 + → SSH 终端。
-
- 终端 右侧带“文件”文字的文件夹按钮。
远程指标¶
- 每约 2 秒采样远端 CPU、内存和网卡计数,换算成下行/上行速率。
- 仅在终端可见时轮询。
Agent 远程控制¶
插件提供六个工具:
ssh_list:列出连接、状态、指纹。ssh_connect/ssh_disconnect:预连接或断开。ssh_exec:非交互执行命令,支持超时与伪终端。ssh_files:SFTP 列目录。ssh_upload/ssh_download:文件/目录上传下载,支持递归与取消。
约束:
- Agent 的本地路径必须位于当前 Session 工作目录内。
- Agent 不能创建连接或读取/修改凭据。
- 目录传输默认跳过
.git和node_modules,单次最多 1000 个文件。
SFTP 文件管理¶
- 目录浏览、上传(多选/拖拽)、下载、新建目录、重命名、删除。
- 文件夹可一键打包为
.tar.gz下载。 - 上传/下载显示实时进度条与已传输大小,支持取消。
- 文件夹打包下载在没有
Content-Length时显示不确定进度。
安全边界¶
- 主机密钥首次连接固定(TOFU)。
- 浏览器 API 走 DSH 已认证的
/api通道。 - 连接凭据只保存在 Host 本地(
0600),不回传给浏览器。 - 凭据保存在
$DSH_HOME/ssh/connections.json,目录0700、文件0600。
中英双语¶
- 跟随 DSH 的语言设置实时切换,无需刷新或改配置。
安装与启用¶
插件按本地 bundle 开发,包名 @local/dsh-ssh 仅本地作用域,不发布到 npm。
获取源码¶
git clone https://github.com/Callay02/dsh-ssh.git
cd dsh-ssh
方式 A:由 Agent 使用 plugin_manager 安装(推荐)¶
在 Creator 模式(或启用了 tool-plugin-manager 的 profile)中,对 Agent 说:
用 plugin_manager 的 install_bundle 安装这个本地目录:
/absolute/path/to/dsh-ssh
install_bundle 会完成 pnpm 安装与 bundle 选择。安装后刷新页面,即可在右下角看到 SSH 按钮,或在右侧栏 + 菜单中选择 SSH 终端。
方式 B:手动链接(无法使用 plugin_manager 时)¶
- 安装依赖并构建客户端:
pnpm install
pnpm run build
- 在
$DSH_PROFILE_DIR/package.json中加入依赖(先备份):
{ "dependencies": { "@local/dsh-ssh": "link:/absolute/path/to/dsh-ssh" } }
-
在 profile 目录执行
pnpm install --ignore-scripts。 -
在
$DSH_PROFILE_DIR/cordis.patch.yml末尾加入:
- insert:
- id: ssh
name: '@local/dsh-ssh'
- 重新加载页面(桌面版可重启应用)。HMR 会重组配置并加载 Host 行。
手动编辑 profile 会写入工作区之外的文件。请先备份
package.json、pnpm-lock.yaml与cordis.patch.yml。
典型用法¶
人工使用¶
- 点击右下角 SSH 按钮,或右侧栏 + → SSH 终端,在右侧栏打开 SSH。主对话仍在左侧,可以直接继续聊天。
- 在侧栏顶部选择连接,或点 + 新建连接;填写主机、端口、用户名与认证方式,先测试连接。
- 选中连接后点连接;点 + 终端打开交互式 Shell,或点文件管理 SFTP。
- 侧栏可以收起(终端在 Host 侧继续运行)或拖宽/全屏;刷新页面后仍存活的终端会自动恢复。
- 首次连接会记录主机密钥指纹;以后指纹变化会拒绝连接,需在编辑连接中显式“忘记该密钥”。
Agent 使用¶
工具在插件启用后自动注册。示例对话:
用 ssh_list 看看有哪些服务器;连上 web-1,执行 df -h 和 systemctl status nginx
把本地 dist/ 上传到 web-1 的 /var/www/app/,然后重启服务
把远程 /var/log/nginx/error.log 下载到工作区
配置¶
在 cordis.patch.yml 的 ssh 行上提供 config(全部可省略):
- id: ssh
config:
dataDir: ~/.dsh/ssh
connectTimeoutMs: 20000
execTimeoutMs: 120000
maxOutputChars: 131072
maxTerminalChars: 524288
maxTerminals: 8
keepaliveIntervalMs: 15000
| 字段 | 默认 | 说明 |
|---|---|---|
dataDir |
$DSH_HOME/ssh |
connections.json 所在目录 |
connectTimeoutMs |
20000 |
SSH 握手超时 |
execTimeoutMs |
120000 |
ssh_exec 默认超时 |
maxOutputChars |
131072 |
单条命令每个输出流的上限 |
maxTerminalChars |
524288 |
每个终端保留的滚动回看字符数 |
maxTerminals |
8 |
同时存活的交互终端上限 |
keepaliveIntervalMs |
15000 |
SSH keepalive 间隔 |
适用场景与注意¶
- 适合需要同时进行对话与运维操作的场景,如调试服务、查看日志、上传部署包等。
- 插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证。
- 终端传输使用长轮询(最长 8 秒一次挂起请求),不适合高帧率全屏程序。
- Host 进程重启后终端与连接都会丢失;终端滚动缓冲不持久化。
- 暂不支持端口转发、跳板机/ProxyJump、多跳、密钥生成与管理、sudo 密码交互。
- 凭据未接入 macOS Keychain / Windows Credential Manager。
- 删除非空远程目录需要先用其它方式清空(SFTP
rmdir语义)。
总结¶
DSH SSH 插件将 SSH 终端、SFTP 文件管理和远程指标采集集成到 DSH 右侧栏,让对话与运维在同一界面完成。多连接管理、交互式终端、Agent 工具集与主机密钥固定(TOFU)提供了完整的远程操作能力。
- 目录页:https://www.skillhub.cn/plugins/Callay02/dsh-ssh
- GitHub:https://github.com/Callay02/dsh-ssh