中文 · English
DSH SSH Ops
DeepSeek Harness 的 SSH 运维插件:在主对话中驱动当前服务器,同时在右侧保留真实的交互式终端,并集成文件管理、端口转发与数据库管理。
v0.3.11:修复 shell integration 的 shell 家族探测(此前探测输出被 cwd 标记污染,导致总是按 zsh 变体注入、bash 上整行脚本失效),并把 shell 状态补进终端上下文的结果契约。
v0.3.10:数据库面扩展——新增 SQLite(宿主内置 node:sqlite,零新依赖)、ClickHouse(HTTP 接口)、openGauss(复用 PostgreSQL 协议)三种驱动,查询结果可导出 CSV/JSON(经 SSH 的库直接把文件写到服务器,用 SFTP 面板下载);新增动态 SOCKS5 隧道(ssh -D);新增会话录制与日志(面板可预览/搜索/下载,agent 读取需批准并自动脱敏);新增 OSC 133 shell integration,终端上下文能给出 cwd、退出码与提示符状态;SFTP 面板获得文本编辑器、目录过滤、路径收藏与拖拽上传。
v0.3.9:兼容 DSH 0.1.6-alpha.2——适配新宿主 typert 校验(schema 与 strict codec 必须携带 create() 工厂,浏览器端 web boot 同样校验)与槽位注册新规则(拒绝同 id 重复注册,此前会导致 SSH 标签从官方侧边栏消失);修复含 null 默认远程项目目录的资源记录导致配置无法读取的问题(#20);数据库驱动改为首次连接时懒加载。
v0.3.8:按 DSH 插件市场惯例将宿主兼容性唯一声明在四个官方包的 peerDependencies 中,覆盖 0.1.2-rc.1、0.1.3-alpha.2、0.1.5-alpha.1 与已验证的 0.1.6-alpha.1 预发布线;移除不被市场使用的 engines.dsh,避免两套版本口径分叉。
v0.3.5:移除不再维护的「运维模式」预设安装器,避免生成无效的 npm 命令入口;SSH 资源可保存一个默认远程项目目录,点击“进入项目”后终端和 SFTP 会从同一目录开始。
v0.3.4 新增:分栏各走一条独立通道——同一台服务器在两个分栏各开一次会各建一条连接,两条通道、两个终端、各自保留自己的当前目录,不再镜像同一个终端;想共用终端可在连接对话框勾选「复用已打开的连接」。Agent 的作用目标可见、可切换:正在被 Agent 使用的那一栏带蓝色机器人徽标,点另一栏即把 Agent 切过去。不符合 RFC 4253 的 SSH 横幅不再连不上:对端把自我介绍写坏(如 SSH-2.0- OpenSSH 多一个空格、SSH-2.1-)时,此前 ssh2 只会抛一句不说明任何原因的 Invalid identification string,现在仅在它因此拒绝后重试一次并把该行规范化(软件版本原样保留、加密强度不受影响);确实不可用的横幅会明确报出对端原文。另修复在设置页点「连接」不会打开/载入 SSH 窗口的问题。上一版的共享凭据、跳板机、连接复用与终端主题见 0.3.3。桌面版安装说明见 INSTALL.md。
兼容性
- 目标宿主:DSH Desktop / Web Profile
0.1.6 系列;本项目当前开发环境已验证 0.1.6-alpha.1 与 0.1.6-alpha.2。插件使用 DSH 自带的 Node.js 运行时,不要求系统另装 ssh、sftp 或独立 Node.js。
- 新版右侧边栏:宿主同时提供
sidebarRightTabs 与 sidebarRight 时,SSH 作为官方右侧边栏标签运行,支持宿主分栏、缩放和全屏。
- 旧版回退:缺少上述右侧边栏 API 时,插件自动使用原有浮动 SSH 面板;终端、SFTP、隧道、数据库和 Agent 工具仍可用,但不会获得官方边栏标签和分栏体验。
- 文件字节流:大文件的浏览器上传/下载路由仅在 Web Profile 同时提供
webServer 与请求来源校验服务时注册;不具备该接口的宿主继续使用既有 SFTP 操作。目录归档下载在所有宿主上均返回 501 archive-unavailable,避免 SFTP chroot 与 SSH shell 命名空间不一致造成越界。
- 升级方式:安装或升级后必须完整退出并重启对应 DSH Profile。SSH 资源、已知主机和凭据位于 DSH 的独立本地存储,不在插件包内;常规升级不会删除它们。
示例
主对话直接指挥已连接的服务器,SSH 终端作为官方右侧边栏标签与对话并排显示:
主对话与官方侧栏中的 SSH 终端
文件页签支持 SFTP 管理,并可用 cd 将交互终端切换到选中的远程目录:
官方侧栏中的 SFTP 文件管理与 cd
数据库管理界面
SSH 资产管理
能做什么
- 官方右侧边栏集成(新版 DSH):SSH 终端是官方右侧边栏的一个标签页(与内置「文件」并列),聊天顶部的 SSH 按钮打开或聚焦该标签(重复点击只聚焦、不重复创建);需要同时看文件和终端时使用官方分栏,拖宽、全屏、收起全部由官方管理,终端尺寸随之自动重算。分栏时每个窗格独立:各自维护可见的服务器与选中项,新窗格默认空白、不继承已有服务器;同一台服务器在两栏打开会各建一条独立连接(可在连接对话框勾选复用),关掉其中一栏不影响另一栏,某台服务器不再被任何窗格显示时才真正断开宿主连接。被 Agent 使用的连接带「Agent」徽标,点另一栏即可把 Agent 切过去。连接生命周期与标签显示分离:切换标签、收起侧栏、关闭标签、切换聊天都不会断开 SSH;终端实例常驻内存池,重新打开即恢复完整回看,隐藏期间服务器输出由宿主缓冲、重开时自动补齐。旧版 DSH(无
sidebarRightTabs)自动回退为浮动面板模式,行为不变。
- 终端跟随 DSH 明暗主题:xterm 渲染在自己的 canvas 上、继承不了 CSS 文字色,因此内置完整的明/暗两套对比色板(含光标与选区),随宿主主题切换立即重绘已经打开的终端。
- 在 设置 → SSH 资源 中管理任意数量的服务器和分组;它作为左侧菜单的一等项,与通用设置、模型并列,不再藏在“插件”下。顶部的 SSH 仅打开或聚焦右侧终端标签(旧版 DSH 中为显示/隐藏浮动面板,均不断开连接)。
- 固定远程项目目录:每台保存的服务器可选填一个绝对路径作为默认项目目录。资源卡片上的“进入项目”会建立连接、在经过空闲 shell 与单 PTY 校验后切换终端目录,并让 SFTP 从同一路径载入;目录不接受相对路径或控制字符。未设置的资源仍从登录目录和 SFTP 根目录开始。
- 服务器名称、地址、端口、用户名、认证类型和分组保存到 DSH 本地存储;数量不设上限。
- 密码、PEM 私钥和私钥口令仅保存到 DSH 官方本机凭据库
~/.dsh/.credentials.yaml(owner-only 权限);浏览器存储、Agent 上下文、工具结果和资源列表均不会读取或显示秘密内容。
- 共享凭据:一份密码或私钥可保存为共享凭据,供多台服务器与跳板机共同引用(例如全组共用同一把运维私钥,改一处即全部生效)。仍被服务器或跳板链引用时拒绝删除;密文只在宿主端解析后交给 SSH 客户端,不进入浏览器存储、不进入 Agent 上下文。在 设置 → SSH 资源 中新增/编辑/删除,支持选择或直接把 PEM 文件拖入窗口。每台服务器既可绑定共享凭据,也可保留自己的专属凭据。
- 跳板机(ProxyJump):跳板机从已保存的服务器中选择(不再是手填主机与密码),密码/私钥/口令统一取自凭据库,跳板同样可复用共享凭据;保存与连接时拒绝把自己设为跳板、重复选择同一台或不存在的资源。跳板链最多 8 跳。
- 每栏各自一条通道(默认):同一台已保存服务器在两个分栏各打开一次会各建一条独立连接——两条通道、两个终端,互不干扰,各自保留自己的当前目录。要改成共用,在连接对话框勾选「复用已打开的连接」:本栏加入已有那条连接,与另一栏共用同一个终端(适合想在同一终端里看着 Agent 干活)。
- Agent 的作用目标可见、可切换:面板上被 Agent 使用的连接带「Agent」徽标。点另一栏的服务器标签或终端区域即把 Agent 切到那一栏——Agent 省略
connection_id 的工具(ssh_exec、sftp_*、tunnel_*、安全确认卡片)默认作用于它。切到已失效的连接会被拒绝,原有绑定保持不变,不会把 Agent 悬空。
- 主对话自动识别当前右侧已连接服务器,无需向用户索取内部连接 ID。
- Agent 发出的
ssh_exec 命令会显示在右侧终端,并回传退出码、输出、cwd、耗时、超时和截断状态。Linux 上能唯一确认空闲 POSIX 交互 shell 时继承其实际目录;终端繁忙、候选不唯一或目录不可访问时拒绝执行,未检测到交互 shell 时使用登录初始目录并明确标注。
- 对手动终端输出提供按需
ssh_read 读取;不会静默把人工终端内容塞入对话上下文。
- 输出给模型前会脱敏私钥、Bearer Token、常见密码/API Key(含裸
sk- 开头的密钥)和数据库连接口令。
- 连接稳定性:SSH 连接启用 keepalive(20 秒间隔、3 次判定),NAT/防火墙不再静默丢弃空闲连接;传输意外断开后指数退避自动重连(上限 30 秒),命令中途掉线透明重试一次,瞬时连接失败自动重试 3 次(认证失败除外);显式断开或插件卸载不触发重连,重连后远程隧道自动重新注册。对端 SSH 横幅不符合 RFC 4253 时(例如
SSH-2.0- OpenSSH 只多一个空格、SSH-2.1-)不再直接失败:ssh2 一向只认 SSH-2.0-/SSH-1.99- 并抛出信息量极低的 Invalid identification string,现在仅在它因此拒绝之后重试一次,由插件把该行规范化后再交给它握手(对端软件版本原样保留,连接的加密强度不受影响),成功会给出警告;确实不可用的横幅(只支持 SSH-1 的设备、缺少软件版本)则明确报出对端原文与原因,不反复重试。
安全边界
DSH 自身权限机制仍然有效。本插件额外阻止 Agent 工具执行明显不可逆或破坏性操作,例如删除文件、删库、格式化磁盘、terraform destroy、kubectl delete、docker prune、强制 Git 清理以及重启/关机。
Agent 命中上述黑名单时不会被静默拒绝:插件会创建一条一次性的待确认记录,并立即在整个视口弹出确认模态(含完整命令、风险原因与「执行 / 撤销」按钮;Esc、点遮罩或「稍后在面板中处理」可暂时收起,全部处理完自动关闭;面板重开时仍未处理的会再次弹出)。未处理项同时常驻在右侧 SSH 面板「终端」窗口上方,卡片默认折叠为单行摘要(命令 + 主机名 + 常驻执行/撤销按钮),最新一条自动展开,点击展开风险说明与完整命令。只有操作者点击红色「执行」才会将命令发送到服务器(自动追加回车);「撤销」清除该记录。危险命令不再预填到终端命令行——输入行始终为空,操作者不可能因误按回车而执行。多条危险命令作为独立卡片排队。若当时没有活跃的终端会话、或命令含 Tab 等无法安全发送到 PTY 的控制字符,则降级为在对话中返回一张可复制的命令卡片,供操作者粘贴到终端执行。普通运维操作(配置 SSL、安装软件包、修改配置、重载服务等)可以正常通过 DSH 的权限流程执行。
同样的模型覆盖 sftp_delete(不再由 Agent 直接删,改为将等价 rm -rf <路径> 加入待确认队列)和 db_execute 的高危 SQL(DROP/TRUNCATE/SHUTDOWN):高危 SQL 保持现有模式,返回带 ```sql 代码块的卡片,供操作者粘贴到数据库面板的 SQL 编辑器手动执行。SQL 判断按语句动词识别(跳过字符串/注释、支持多语句、按 ; 切分),不会误杀字符串字面量里的关键字,高频增删改查正常放行。
凭据使用建议:ssh_connect / db_connect 以明文参数接收密码或私钥时,这些参数会进入对话与工具调用记录。生产环境请优先把服务器保存为「SSH 资源」(密码存入宿主加密凭据库,面板与 Agent 只见引用),或使用密钥文件的 passphrase 方式,避免在对话中直接传递密钥。
安装
从 GitHub 安装(推荐)
dsh plugin --profile web add github:caoyiwei850/dsh-ssh-ops#v0.3.11
安装后重启 DSH Web:
dsh web
然后打开任意会话,点击顶部的 SSH 标签,使用右侧面板连接服务器。
从发布压缩包安装
从 GitHub Releases 下载 dsh-ssh-ops-0.3.11.tgz 后:
dsh plugin --profile web add /path/to/dsh-ssh-ops-0.3.11.tgz
dsh web
dsh-ssh-ops-0.3.11.zip 适用于离线审阅或二次开发;解压后可在目录中执行 npm install && npm run build。
使用方式
- 打开 设置 → SSH 资源,新建分组或服务器资源;PEM /
.key 文件可直接导入。
- 保存的资源可直接“连接并打开”,并自动创建右侧 PTY 终端。编辑时秘密字段留空会保持原值;清除凭据需要显式确认。
- 顶部 SSH 仅控制右侧终端的显示和隐藏;右上角
+ 可选择已保存资源,或创建不落盘的临时连接。
- 在主对话中直接说“查询服务器内存使用情况”或“配置 Nginx SSL 证书”。主 Agent 只能操作当前活动连接,不能枚举保存资源、读取凭据或自动用保存凭据连接。
- 需要数据库时,让 Agent 调
db_connect(或自己在「数据库」页签新建连接),随后即可在对话中查询/执行。
Agent 工具
共 31 个 Agent 工具,省略 connection_id / db_connection_id 时默认作用于当前活动连接,无需先调 ssh_list / db_list_connections。
SSH(6)
| 工具 | 用途 |
|---|
ssh_list | 查看当前活动连接的安全元数据(不包含保存资源或秘密);仅在用户问“连了哪台”时用 |
ssh_connect | 建立 SSH 连接(密码或私钥)并设为当前服务器 |
ssh_exec | 在当前服务器执行 Agent 命令(继承交互 shell 当前目录),回传退出码/输出/cwd/耗时/超时/截断/脱敏状态 |
ssh_read | 按需读取右侧终端缓冲输出(不静默塞入对话) |
ssh_write | 向指定终端写入交互输入;press_enter(默认 true)自动补回车提交(可传 connection_id 指定目标服务器的终端) |
ssh_disconnect | 断开当前连接及其 shell 会话 |
手动终端上下文(2)
| 工具 | 用途 |
|---|
ssh_terminal_sessions | 列出已打开终端的低敏元数据与读取游标,不返回终端内容或凭据 |
ssh_terminal_context | 经每次用户确认后,按游标读取指定手动终端的有限、脱敏历史;不会影响右侧终端回看 |
SFTP(6)
| 工具 | 用途 |
|---|
sftp_list | 列出远程目录条目(含大小/mtime/权限) |
sftp_read | 读取远程文件内容(默认上限 4 MiB) |
sftp_write | 写入远程文件(创建或覆盖) |
sftp_mkdir | 新建远程目录 |
sftp_delete | 删除远程文件或空目录(不直接执行,改为把 rm -rf <路径> 加入待确认队列或返回可复制卡片) |
sftp_rename | 重命名/移动远程路径 |
端口转发(3)
| 工具 | 用途 |
|---|
tunnel_start | 建立本地转发(local,本机 → 服务器可达目标)或远程转发(remote,服务器 → 本机) |
tunnel_list | 列出活动隧道 |
tunnel_stop | 按 tunnel_id 停止隧道 |
批量执行(1)
| 工具 | 用途 |
|---|
ssh_batch | 基于 SSH 资源中已保存服务器(含未连接的)创建批量执行任务,由操作者在面板勾选确认后并发下发,结果按服务器分节;仅当用户明确要求多机批量时使用(旧的 ssh_cluster 已彻底移除,多机操作无免确认路径) |
数据库(14)
| 工具 | 用途 |
|---|
db_connect | 连接 MySQL / PostgreSQL / Redis / MongoDB;回环地址自动经当前 SSH 服务器隧道,SSL 三档可选 |
db_list_connections | 列出已打开的数据库连接(仅用户询问时用) |
db_query | 在 MySQL/PostgreSQL 上跑词法级强制只读查询(仅放行 SELECT/SHOW/DESCRIBE/EXPLAIN/纯查询 WITH;拒绝写动词、SELECT INTO、FOR UPDATE 锁读、数据修改 CTE);结果默认流式截断 200 行,30s 超时;DSH_SSH_OPS_MAX_DB_ROWS 可调整为最多 5000 行;支持 ? / $1 占位符 |
db_execute | 执行写语句(INSERT/UPDATE/DELETE/CREATE/ALTER);高危 SQL(DROP/TRUNCATE/SHUTDOWN)不执行,返回可复制卡片 |
db_list_tables | 列出 MySQL/PostgreSQL 当前 schema 的表 |
db_describe_table | 完整表结构:列、索引、外键、行数/容量估计、MySQL 附 SHOW CREATE TABLE DDL |
db_preview | 按表名分页采样数据(LIMIT/OFFSET 参数绑定,标识符白名单防注入),附全表行数估计,无需手写 SQL |
db_explain | 查看查询执行计划(EXPLAIN FORMAT=JSON),检查索引使用 |
db_tx_begin / db_tx_execute / db_tx_commit / db_tx_rollback | 交互式事务工作流:开事务 → 执行变更 → SELECT 验证 → 提交/回滚(独占连接,闲置 5 分钟自动回滚) |
db_run | 在 Redis 上跑命令(command+args),或在 MongoDB 上跑 find/findOne/insertOne/updateOne/deleteOne/countDocuments |
db_disconnect | 关闭数据库连接 |
db_query 用于 SQL 只读查询,db_execute 用于 SQL 写操作,db_run 用于 Redis/MongoDB。MySQL 用 ? 占位符、PostgreSQL 用 $1 占位符。
开发
npm install
npm test
npm run build
npm run pack:release
推送与 package.json.version 一致的 vX.Y.Z tag 时,GitHub Actions 会测试、构建并从同一个 .tgz 同时发布 npm 包和 GitHub Release。首次启用前,在仓库 Secrets 配置 NPM_TOKEN。发版改完版本号后先执行 npm run bump:readme,把 README/README.en 中的徽章、安装命令与发布链接一并同步到新版本。
生成物位于 release/:
dsh-ssh-ops-0.3.11.tgz:可直接被 DSH 安装。
dsh-ssh-ops-0.3.11.zip:完整离线源码包。
许可
MIT