这个插件是什么
DSH SSH Ops 是一个把远程服务器操作搬进会话里的 DeepSeek Harness 插件。你在主对话里描述任务,Agent 通过 SSH 执行对应命令,而一个真实的交互式终端就停在 Harness 官方右侧边栏、和对话并排。围绕这条主线,它还提供 SFTP 文件管理、端口转发、多机批量执行,以及 MySQL、PostgreSQL、Redis、MongoDB 的数据库访问。
发布包名为 dsh-ssh-ops,版本 0.3.5,许可为 MIT,仓库是 github.com/caoyiwei850/dsh-ssh-ops。它的 package.json 声明 main: lib/index.js,另有 ./typert、./remote、./client 三个导出入口,所以装到机器上的是预编译好的 JavaScript,不是你还需要自己编译的源码。
dsh 字段告诉 Harness 什么、进而实际装上什么,值得单独看清:
dsh.bundle.patch指向./cordis.patch.yml,安装这个包的同时会把该组合补丁应用到你的 profile。包的files清单会一起发布lib、scripts、cordis.patch.yml、INSTALL.md与LICENSE。dsh.client声明platform: "web",并注入@deepseek-ai/dsh-client-runtime——终端和数据库面板是浏览器端渲染的客户端代码。- 运行时依赖为
ssh2、mysql2、pg、pg-cursor、redis、mongodb、zod。README 另有一处说明:较新的 DSH 会通过@xterm/xterm安装客户端终端;而@xterm/xterm与@xterm/addon-fit在已发布的清单里被列在 devDependencies 而非运行时依赖,README 并未解释这一差别。
它具体能做什么
README 描述的是右侧一个带页签的面板——终端、文件、转发、数据库——外加 29 个 Agent 工具,按 SSH(6)、SFTP(6)、端口转发(3)、批量执行(1)、数据库(14)分组。凡是接受 connection_id / db_connection_id 的工具,省略参数时都作用于当前活动连接,因此 Agent 不需要先调 ssh_list 或 db_list_connections。
- 命令执行:
ssh_exec在当前服务器执行 Agent 命令,并回传退出码、输出、cwd、耗时、超时与截断状态。README 称它在能唯一确认存在空闲 POSIX 交互 shell 时继承该 shell 的实际目录;终端繁忙、候选不唯一或目录不可访问时拒绝执行。 - 终端读写:
ssh_read按需读取侧边终端的缓冲输出,人工终端内容不会被静默塞进对话;ssh_write向终端写入交互输入,press_enter默认为 true。 - 文件传输:SFTP 的列出、读取(默认上限 4 MiB)、写入、新建目录、重命名、删除,面板与工具两条路径都可用。
- 端口转发:本地转发(本机 → 服务器可达目标)与远程转发(服务器 → 本机),可在面板建立、查看、停止,也可用
tunnel_*工具。 - 多机批量:
ssh_batch基于 SSH 资源中已保存的服务器创建批量任务,包含未连接的那些;随后面板弹出勾选窗口,由操作者确认后并发下发,每台各自建连、执行、断开,结果按服务器分节。README 明确说旧的ssh_cluster(基于已打开连接、无需确认即群发)已被彻底移除。 - 数据库:支持 MySQL、PostgreSQL、Redis、MongoDB;回环地址的数据库会自动经当前 SSH 服务器隧道访问内网库(可关)。
db_query是 MySQL/PostgreSQL 上的词法级只读闸,db_execute负责写操作,db_run负责 Redis 命令与 MongoDB 操作,另有闲置 5 分钟自动回滚的交互式事务工作流。
侧边终端是真 PTY
README 描述的是一个真正的交互式终端,而不是日志视图:原文是「并自动创建右侧 PTY 终端」——连接一个已保存资源就会在右侧建立 PTY 终端。它由 xterm 渲染在自己的 canvas 上,因为继承不到 CSS 文字色,所以内置了完整的两套明/暗对比色板,宿主主题切换时会立即重绘已经打开的终端。连接生命周期与标签显示是分离的:切换标签、收起侧栏、关闭标签、切换聊天都不会断开 SSH;终端实例常驻宿主内存池,重新打开即恢复完整回看,隐藏期间服务器输出由宿主缓冲。
人工输出与 Agent 命令在同一个终端里汇合——Agent 命令会显示在该终端中——但 README 并没有把终端描述成 Agent 的输入通道。它描述的恰恰是相反的流向:Agent 按需用 ssh_read 读取终端,而不是让人工终端内容静默进入对话。一个人直接在终端里敲字能否影响 Agent 的下一条命令,源文件没有涉及;源文件只说明 ssh_exec 在终端繁忙时拒绝执行。
安全模型,逐字读
对一个在别人机器上跑命令的工具来说,这一节最该读清楚。这里的防护不是 dry-run,也不是先给你一份计划差异;它是黑名单加操作者确认队列。
先看 README 的原话:「DSH 自身权限机制仍然有效。本插件额外阻止 Agent 工具执行明显不可逆或破坏性操作,例如删除文件、删库、格式化磁盘、terraform destroy、kubectl delete、docker prune、强制 Git 清理以及重启/关机。」也就是说,DSH 自身的权限机制依然生效,插件另外拦住它判定为「明显不可逆或破坏性」的操作。
命中之后会发生什么,README 写得很具体:插件创建一条一次性的待确认记录,并立即在整个视口弹出确认模态(含完整命令、风险原因与「执行 / 撤销」按钮);未处理项同时常驻在右侧 SSH 面板终端窗口上方的卡片里。README 的原话是「只有操作者点击红色「执行」才会将命令发送到服务器(自动追加回车)」;危险命令不再预填到终端命令行,输入行始终为空,因此误按回车不会执行任何东西。如果当时没有活跃的终端会话,或命令含 Tab 等无法安全发往 PTY 的控制字符,就降级为在对话中返回一张可复制的命令卡片,由操作者自己粘贴执行。
同一套机制覆盖三个面:ssh_exec 的 shell 命令、sftp_delete(不再由 Agent 直接删,改为把等价 rm -rf <路径> 加入待确认队列)、以及 db_execute 的高危 SQL(DROP/TRUNCATE/SHUTDOWN 返回带 sql 代码块的卡片,供操作者粘贴到数据库面板手动执行)。README 说明 SQL 判断按语句动词识别,会跳过字符串与注释、支持多语句(按 ; 切分),不会误杀字符串字面量里的关键字。而配置 SSL、安装软件包、修改配置、重载服务这类普通运维操作,可以正常通过 DSH 的权限流程执行。
有三件事 README 没有说,读者不应该自行补全:
- 谁来决定什么算危险。 README 说插件会拦住它判定为破坏性的操作,并给出例子,但没有公布任何模式清单,也没有说明清单如何修改。
- 能不能关掉。 没有任何配置开关、阈值或旁路被写进文档。这只是「没有记载的关闭途径」,不等于「无法绕过」。同一处值得一并留意:插件还注册了
ssh_write,一个「向指定终端写入交互输入」的工具,而 README 的安全边界一节没有说明这条路径是否也走同一套确认队列。 - 是否还有其他闸门。 除黑名单之外,README 没有描述逐命令的白名单、对普通命令的强制审批,也没有对每条命令的事前审批。这里说的「防护」覆盖的是破坏性那一小部分,不是全部流量。
凭据:存什么、存哪里、以什么形态
认证支持密码、PEM 私钥与私钥口令,README 对存储位置的表述相当明确:「密码、PEM 私钥和私钥口令仅保存到 DSH 官方本机凭据库 ~/.dsh/.credentials.yaml(owner-only 权限);浏览器存储、Agent 上下文、工具结果和资源列表均不会读取或显示秘密内容。」
也就是说,已保存资源的秘密放在 Harness 自己的本机凭据库 ~/.dsh/.credentials.yaml,文件权限限于属主。README 逐一列出了不接触它的面:浏览器存储、Agent 上下文、工具结果、资源列表都不会读取或显示秘密内容;数据库 profile 的密码则被描述为加密存储于 DSH 凭据库。
有两句话不能往外延伸。README 担保的是这个库是官方的、文件是 owner-only 的;它没有给出加密算法、密钥派生方式或主密钥位置,除了把数据库密码存储称为「加密」之外,也没有说这个文件本身是加密的。Agent 的触及范围同样由这段话划定:「主 Agent 只能操作当前活动连接,不能枚举保存资源、读取凭据或自动用保存凭据连接。」
共享凭据在另一个方向上改变了图景,值得理解:一份密码或私钥可以保存为共享凭据,供多台服务器与跳板机共同引用;README 说密文只在宿主端解析后交给 SSH 客户端,不进入浏览器存储、不进入 Agent 上下文;仍被服务器或跳板链引用时拒绝删除。
README 真正记录下来的泄露路径不是凭据库,而是那条捷径:「凭据使用建议:ssh_connect / db_connect 以明文参数接收密码或私钥时,这些参数会进入对话与工具调用记录。生产环境请优先把服务器保存为「SSH 资源」(密码存入宿主加密凭据库,面板与 Agent 只见引用),或使用密钥文件的 passphrase 方式,避免在对话中直接传递密钥。」换句话说,把密码或私钥当明文参数传给 ssh_connect / db_connect,它就会落进对话与工具调用记录;README 给出的补救办法是改用 SSH 资源保存,或改用密钥文件口令方式。
运行要求
- Node 版本:源文件未说明。 已发布的
package.json里没有engines字段,README 也没有给出最低 Node 版本。你在别处看到的任何数字都不算数。 - Harness 下限:README 写明的目标宿主是 DSH
0.1.5系列,并说明本项目当前开发环境为0.1.5-rc.2——本站把这条声明逐字记录为dshTarget。README 里最新的集成方式——SSH 作为官方右侧边栏的标签页——需要带sidebarRightTabs的新版 DSH。旧版 DSH(无sidebarRightTabs)会自动回退为浮动面板模式,README 称行为不变。 - Profile 与平台:面向 DSH Web,
dsh.client.platform是"web",README 的安装步骤以重启 Web 界面收尾。 - 系统二进制:文档没有提出任何要求。SSH 栈是 npm 上的
ssh2,终端是@xterm/xterm,这些都随包安装,而不是需要你预装的系统工具。 - 宿主配置:已保存服务器、分组、跳板机(ProxyJump,从已保存服务器中选择而非手填,跳板链最多 8 跳)与主机指纹校验模式,都在 设置 → SSH 资源 里配置。每台已保存服务器可选填一个绝对路径作为默认项目目录,相对路径与控制字符会被拒绝。除了一台你能认证的 SSH 服务器,README 没有说明远端还需要什么。
已知限制与失效模式
- 防护只覆盖破坏性那一部分。 没有任何模式列表能覆盖所有破坏性命令。README 给出的是一串例子,不是完备性承诺;真正被强制执行的,只是模式列表认得出来的那些。
- 重连行为:keepalive 间隔 20 秒、3 次判定;传输意外断开后指数退避自动重连,上限 30 秒;命令中途掉线透明重试一次;瞬时连接失败自动重试 3 次(认证失败除外);显式断开或插件卸载不触发重连;重连后远程隧道自动重新注册。
- 主机指纹校验(TOFU):默认
accept-new(首次连接记录并信任),每台服务器可选verify或off。指纹变化时不重试、不自动重连,只提示用「忘记指纹」重置。校验发生在用户认证之前,与登录账号无关。 - 输出处理:README 称输出给模型前会脱敏私钥、Bearer Token、常见密码/API Key(含裸
sk-开头的密钥)与数据库连接口令。Agent 命令的输出会显示在侧边终端,并随退出码、cwd、耗时、超时、截断状态一起回传。 - 信任边界:插件用你给的凭据在远程主机上执行命令。README 没有声称这套防护是穷尽的,也没有声称它适合生产机群;本目录标注的
security: unverified就是这个意思——这个站点不对任何条目做自动化安全扫描。 - 批量执行:
ssh_batch的目标由操作者从已保存服务器中勾选,与当前打开的连接完全无关。README 明确说ssh_cluster移除后,多机操作不再有免确认路径。 - 横幅兼容的代价:对端 SSH 横幅不符合 RFC 4253 时(例如
SSH-2.0- OpenSSH多一个空格、SSH-2.1-),插件在 ssh2 拒绝之后重试一次并规范化该行再交给握手,对端软件版本原样保留;确实不可用的横幅会明确报出对端原文与原因,不反复重试。
什么时候用它,什么时候不要用
适合用在「普通的、可重复的服务器运维」上,而且是从对话里驱动:看日志、查内存与磁盘、改配置、配 TLS、重载服务、传文件、为一个内网服务开隧道,或者透过跳板机检查某台主机上的数据库。SSH 资源库、共享凭据、跳板链和默认项目目录这几样,是让反复访问变便宜的部分;而那条独立的确认队列,确实比「模型发什么就跑什么」的工具要好。
不要把它当成机群的安全网。源文件本身就给了三条具体理由:黑名单覆盖的是「明显的破坏性例子」而不是所有破坏性命令;README 从未声称它适合生产机群;而文档里最大的凭据风险——把明文私钥或密码传给 ssh_connect / db_connect——是 README 请你避开的用法,而不是插件替你挡住的行为。如果你没法盯着确认队列,防护会降级成对话里一张可复制的卡片,这意味着决策带着更少的上下文回到了你手上。另外对 ssh_batch 要格外小心:它会一次性把命令扇出到许多已保存主机;如果这条命令你不会亲手在每一台上敲一遍,就不要点确认。
源文件没有说明的内容
列在这里,是为了不让它们被读成承诺:
- README 与包清单里都没有星数、下载量或采用规模数据。本条目 frontmatter 里的
stars与forks来自本目录自己的数据,不来自插件源文件。 - 没有任何安全审计、复核流程、威胁模型、CVE 记录或漏洞上报渠道的说明。
- 没有「防护无法被绕过」的声明,也没有「覆盖所有破坏性命令」的声明——只有上文引用的那些例子。
- 没有把秘密描述为某种加密方案:文件被描述为 owner-only,只有数据库密码存储被称作加密。
- 没有 Node 版本、没有支持的操作系统、除 SSH 服务器外没有远端前置条件,也没有性能或规模数据。
- 除已引用的「终端繁忙时拒绝执行」之外,没有说明一个人在终端里输入的内容能否影响 Agent 的执行路径。
- 关于与另一个插件
dsh-web的「SSH Ops」组件的关系:未核实。本条目写作时无法取得该插件的源文件,因此这里不对两者的功能重叠或差异做任何判断。
FAQ
危险命令防护到底是黑名单、提示,还是更强的东西?
是黑名单加操作者确认。README 说插件阻止明显不可逆或破坏性的操作,把它们排成一次性待确认记录,并弹出含完整命令与「执行 / 撤销」的模态框;在操作者点击「执行」之前,命令不会被送到服务器。它不是 dry-run,对普通命令也不会先给你看执行计划。
我能关掉或绕过这个防护吗?
README 没有记载任何配置开关、阈值或旁路,也没有公布可编辑的模式清单。它同样没有声明防护无法被绕过——请把这份沉默读作「没有文档」,而不是「不可能」,并在生产主机上保持你自己的审批习惯。
我的 SSH 密码和私钥是加密存储的吗?
README 说密码、PEM 私钥和私钥口令仅保存到 Harness 本机凭据库 ~/.dsh/.credentials.yaml,权限为 owner-only;数据库密码存储被描述为加密。它没有给出加密算法或密钥管理方案,所以准确的表述是「官方凭据库中权限限于属主的文件」,而不是泛泛的「静态加密」。
Agent 能读到我的凭据,或者枚举我保存的服务器吗?
README 说主 Agent 只能操作当前活动连接,不能枚举保存资源、读取凭据,也不能自动用保存凭据连接。文档记录的泄露路径是另一回事:当你把密码或私钥作为明文参数传给 ssh_connect 或 db_connect 时,这个值会进入对话与工具调用记录。
Agent 会自动看到我在终端里输入的所有内容吗?
不会。README 说终端输出由 ssh_read 按需读取,人工终端内容不会被静默塞进对话上下文。另外,交给模型的输出会脱敏私钥、Bearer Token、常见密码与 API Key,以及数据库连接口令。

