deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
中文 · English
DeepSeek Harness 的 SSH 运维插件:在主对话中驱动当前服务器,同时在右侧保留真实的交互式终端,并集成文件管理、端口转发与数据库管理。
v0.3.18:新增界面语言钉住开关——DSH 运行插件未内置的语言(如俄语)时,可在设置文件设
autoApplySystemLanguage: false+language钉住插件语言,不再被强制回退中文回写;默认跟随行为不变。见「固定界面语言」说明。贡献:@alexeyfadeev(PR #28)。
v0.3.17:修复 0.3.16 的 #27——i18n 重构漏改变量名导致官方侧栏注册抛
ReferenceError、SSH 终端 UI 完全不可见;eslint 现已覆盖客户端 JSX 并新增回归断言。
v0.3.16:新增中英双语界面——始终自动跟随 DSH「设置 → 语言」(含运行中切换,无需刷新),中文为源、英文覆盖,左侧「SSH 资源」标签与终端图标随语言动态变化;设置页新增自更新条(版本徽标、GitHub 链接、检查更新对话框、一键更新与可复制的手工更新命令);lib 构建产物出库(仓库不再提交打包产物);资源表单布局紧凑化;移除损坏的 ~/.ssh/config 导入;已信任主机列表支持直接删除。
v0.3.15:新增双因素认证——防火墙/交换机把
AuthenticationMethods配成password,publickey(或反序)时,可在资源或共享凭据里为密码/私钥再配一条相反类型的第二因素,这类设备此前必然登录失败;SQL 词法扫描加固,修复反斜杠引号方言与 PG dollar 引用两个破坏性语句漏检(Oracleq''交替引号经实测否决并固化为回归探针);会话日志支持多选 + 全选批量删除;移除旧版 DSH 的浮动面板回退,官方右侧边栏成为 SSH 终端的唯一宿主形态。
v0.3.14:新增默认关闭的「AI 自动连接」开关。开启后,Agent 可按名称连接已保存的 SSH 资源,目标终端自动出现在右侧;关闭时,Agent 无法枚举保存资源。修复会话日志空文件读取问题。
v0.3.13:整轮更新——SFTP 目录批量上传/下载(新工具
sftp_upload_dir/sftp_download_dir:小文件并发、大文件独占、单文件失败不中断整批);SSH 认证失败结构化诊断(试过哪些方法、服务器还接受什么、下一步怎么走),并新增 keyboard-interactive 认证(保存的密码应答交互提示/MFA 门禁,设备掐断时自动降级纯密码重试);数据库连接健壮性三件套(TCP keepalive、空闲复用前活性 ping + 透明重连、断连时手工事务有界收尾);修复 MySQL 未知字符集文本列显示为字节对象的问题;上一版的破坏性操作可逆化(rm 回收站、危险 SQL 自动备份、DROP 隔离改名、绕过向量封堵)一并随本版发布。
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);数据库驱动改为首次连接时懒加载。
peerDependencies 声明为无上界区间 >=0.1.5-alpha.1——宿主以 includePrerelease 语义按 DSH 运行时版本评估,覆盖 0.1.5 起的全部宿主版本(含一切预发布),宿主升级无需发版跟进。当前开发环境已验证 0.2.0-rc.2 桌面版。插件使用 DSH 自带的 Node.js 运行时,不要求系统另装 ssh、sftp 或独立 Node.js。sidebarRightTabs 与 sidebarRight,SSH 以官方右侧边栏标签运行,支持宿主分栏、缩放和全屏。缺少这两个 API 的旧版宿主不再有浮动面板回退(已移除):插件宿主半(Agent 的 SSH/SFTP/数据库工具)照常工作,但不会显示终端 UI。autoApplySystemLanguage: false + language,详见「使用」一节)。webServer 与请求来源校验服务时注册;不具备该接口的宿主继续使用既有 SFTP 操作。目录归档下载在所有宿主上均返回 501 archive-unavailable,避免 SFTP chroot 与 SSH shell 命名空间不一致造成越界。主对话直接指挥已连接的服务器,SSH 终端作为官方右侧边栏标签与对话并排显示:

文件页签支持 SFTP 管理,并可用 cd 将交互终端切换到选中的远程目录:



~/.dsh/.credentials.yaml(owner-only 权限);浏览器存储、Agent 上下文、工具结果和资源列表均不会读取或显示秘密内容。connection_id 的工具(ssh_exec、sftp_*、tunnel_*、安全确认卡片)默认作用于它。切到已失效的连接会被拒绝,原有绑定保持不变,不会把 Agent 悬空。ssh_exec 命令会显示在右侧终端,并回传退出码、输出、cwd、耗时、超时和截断状态。Linux 上能唯一确认空闲 POSIX 交互 shell 时继承其实际目录;终端繁忙、候选不唯一或目录不可访问时拒绝执行,未检测到交互 shell 时使用登录初始目录并明确标注。ssh_read 读取;不会静默把人工终端内容塞入对话上下文。sk- 开头的密钥)和数据库连接口令。SSH-2.0- OpenSSH 只多一个空格、SSH-2.1-)不再直接失败:ssh2 一向只认 SSH-2.0-/SSH-1.99- 并抛出信息量极低的 Invalid identification string,现在仅在它因此拒绝之后重试一次,由插件把该行规范化后再交给它握手(对端软件版本原样保留,连接的加密强度不受影响),成功会给出警告;确实不可用的横幅(只支持 SSH-1 的设备、缺少软件版本)则明确报出对端原文与原因,不反复重试。accept-new(默认)/verify(拒绝未知)/off;指纹变化时不重试、不自动重连,提示用「忘记指纹」重置。设置 → SSH 资源可按服务器设置校验模式、管理已信任指纹并一键忘记。校验在用户认证前,与登录账号/密码无关,同一台服务器换人登录不会被挡。sftp_* 工具直接操作。tunnel_* 工具。ssh_cluster(基于已打开连接、无需确认即群发)已彻底移除:多机操作只能经 ssh_batch 由操作者勾选确认,杜绝「点名一台、全量执行」。db_* 工具直接操作。db_connect 自动 SSH 隧道:连了服务器后,回环地址(127.0.0.1 / localhost / ::1)的数据库自动经当前服务器隧道访问内网库;via_ssh 可选 auto(默认)/yes/no,显式 ssh_connection_id 优先级最高。disabled 不加密 / preferred 加密不验证 / verify 加密+验证 CA)适配云托管数据库。db_query 词法级真只读闸(只放行 SELECT/SHOW/DESCRIBE/EXPLAIN/纯查询 WITH,拦截写动词子查询、PG 数据修改 CTE、SELECT INTO、FOR UPDATE 锁读);查询流式截断默认 200 行 + 30s 超时(可用环境变量 DSH_SSH_OPS_MAX_DB_ROWS 调整,最大 5000;生产环境应按最小必要值配置;MySQL destroy 池连接、PG 用 cursor 分批取);交互式事务工作流 db_tx_begin/execute/commit/rollback(独占连接、变更后验证、闲置 5 分钟自动回滚);db_describe_table 带索引/外键/DDL/行数与容量估计;db_preview 分页采样、db_explain 执行计划。数据库面板含表树、预览视图、一键导出 CSV(含 BOM,Excel 中文兼容)、查询历史(localStorage 50 条)。DB 传输层意外断开不再崩进程(四类客户端统一处理,绝不 throw)。DROP DATABASE/SCHEMA/TABLE、TRUNCATE、SHUTDOWN)自动拦截,按语句动词识别(跳过字符串/注释、支持多语句),不会误杀字符串字面量里的关键字。DSH 自身权限机制仍然有效。本插件额外阻止 Agent 工具执行明显不可逆或破坏性操作,例如删除文件、删库、格式化磁盘、terraform destroy、kubectl delete、docker prune、强制 Git 清理以及重启/关机。黑名单同时覆盖高频绕过变体:find -exec rm、xargs rm、rimraf,以及 python/perl/ruby/php/node 一行流里调用 unlink/rmtree/rmSync 等(源自真实事故:rm 被拦后 Agent 换用其它代码完成删除)。黑名单无法穷尽(任何脚本/管道都可能藏删除),因此下面两层「后果兜底」与它配合,而不是只依赖识别。
删除可逆化(rm → 确认后进远端回收站):Agent 发起的删除依然必须过人手——简单 rm/unlink/rmdir(单条命令、显式字面路径、无管道/重定向/glob/变量展开)照常弹出确认卡片,但点「执行」时执行的是可恢复的移动:目标被 mv 进服务器上的 ~/.dsh-trash/,并在该目录的 manifest.tsv 里记录原绝对路径与时间;24 小时后的过期项会在下一次有新文件进回收站时顺带真删(不在服务器上安装任何定时任务)。也就是说 Agent 发起的删除永远不会真正发生——误删(包括人看错卡片、指错机器)都能从回收站 mv 回来;要彻底删除,由操作者自己在终端执行 rm(人工输入不经过此拦截,边界不变)。ssh_exec 与 sftp_delete 均走此路径,卡片与终端镜像都会注明「执行 = 移入回收站」。复合命令、find -delete、shred 等无法安全改写的删除走原有卡片(执行 = 原命令真跑)。
危险 SQL 可恢复化:db_execute 的高危 SQL(DROP/TRUNCATE/SHUTDOWN,按语句动词识别)依旧绝不执行,但拦截瞬间会自动备份受影响的表——行数据经只读导出通道落盘(SSH 连接的库写到远端 /tmp/dsh-backup-*.csv,直连的库写到 DSH 宿主临时目录),MySQL/SQLite 还会附带建表 DDL(PostgreSQL 暂无 DDL 来源);DROP DATABASE 会逐表备份(上限 20 张,超出明示)。其中 DROP TABLE 进一步转为隔离改名:备份完成后自动 RENAME 为 <表名>_to_be_dropped_<日期>(重名自动加序号),数据原样保留、可随时改回。Agent 永远无法完成真正的删除——隔离表的最终 DROP 只接受面板(人工)发起,Agent 再次发起会被明确拦截。备份/隔离清单会完整出现在工具结果里;备份失败时同样如实标注(隔离改名本身可逆,所以不因备份失败而放弃)。
Agent 命中上述黑名单时不会被静默拒绝:插件会创建一条一次性的待确认记录,并立即在整个视口弹出确认模态(含完整命令、风险原因与「执行 / 撤销」按钮;Esc、点遮罩或「稍后在面板中处理」可暂时收起,全部处理完自动关闭;面板重开时仍未处理的会再次弹出)。未处理项同时常驻在右侧 SSH 面板「终端」窗口上方,卡片默认折叠为单行摘要(命令 + 主机名 + 常驻执行/撤销按钮),最新一条自动展开,点击展开风险说明与完整命令。只有操作者点击红色「执行」才会将命令发送到服务器(自动追加回车);「撤销」清除该记录。危险命令不再预填到终端命令行——输入行始终为空,操作者不可能因误按回车而执行。多条危险命令作为独立卡片排队。若当时没有活跃的终端会话、或命令含 Tab 等无法安全发送到 PTY 的控制字符,则降级为在对话中返回一张可复制的命令卡片,供操作者粘贴到终端执行。普通运维操作(配置 SSL、安装软件包、修改配置、重载服务等)可以正常通过 DSH 的权限流程执行。
同样的模型覆盖 sftp_delete(卡片不变,批准时留回滚副本,见上)和 db_execute 的高危 SQL(备份 + 隔离,见上)。SQL 判断按语句动词识别(跳过字符串/注释、支持多语句、按 ; 切分),不会误杀字符串字面量里的关键字,高频增删改查正常放行。
凭据使用建议:ssh_connect / db_connect 以明文参数接收密码或私钥时,这些参数会进入对话与工具调用记录。生产环境请优先把服务器保存为「SSH 资源」(密码存入宿主加密凭据库,面板与 Agent 只见引用),或使用密钥文件的 passphrase 方式,避免在对话中直接传递密钥。
dsh plugin --profile web add github:caoyiwei850/dsh-ssh-ops#v0.3.18
安装后重启 DSH Web:
dsh web
然后打开任意会话,点击顶部的 SSH 标签,使用右侧面板连接服务器。
从 GitHub Releases 下载 dsh-ssh-ops-0.3.18.tgz 后:
dsh plugin --profile web add /path/to/dsh-ssh-ops-0.3.18.tgz
dsh web
dsh-ssh-ops-0.3.18.zip 适用于离线审阅或二次开发;解压后可在目录中执行 npm install && npm run build。
.key 文件可直接导入。+ 可选择已保存资源,或创建不落盘的临时连接。db_connect(或自己在「数据库」页签新建连接),随后即可在对话中查询/执行。固定界面语言。 可以通过插件设置文件(~/.dsh/storages/ssh_ops_settings.json)关闭自动跟随行为。该功能适用于系统使用插件未内置的第三方语言(如俄语)的场景——若不固定,此类语言会被强制回退为默认中文,且插件会在每次加载时把该值回写进配置文件。改为固定使用指定语言即可:
{
"unit": { "name": "ssh_ops_settings", "version": 1 },
"global": null,
"tables": {
"settings": {
"main": {
"language": "en",
"autoApplySystemLanguage": false
}
}
}
}
autoApplySystemLanguage:true(默认值;字段缺失时与 true 相同)表示跟随 DSH 自身语言并在每次加载时回写,行为与之前完全一致。false 表示固定使用存储的 language 值:既不跟随宿主语言,也不回写,文件保持你手动编辑的状态。升级后首次加载时,插件会把默认值 true 写入配置文件,以便看到该开关。language:"zh" 或 "en",当 autoApplySystemLanguage 为 false 时作为固定语言使用;自动跟随开启时忽略该字段。共 34 个 Agent 工具,省略 connection_id / db_connection_id 时默认作用于当前活动连接,无需先调 ssh_list / db_list_connections。
| 工具 | 用途 |
|---|---|
ssh_list |
查看当前活动连接的安全元数据与秘密无关信息;开启「AI 自动连接」后同时列出已保存服务器(不含凭据),仅在需要枚举时用 |
ssh_connect |
建立 SSH 连接(密码或私钥)并设为当前服务器 |
ssh_connect_profile |
按名称连接已保存的 SSH 资源并设为当前服务器(右侧面板同步打开终端);仅在操作者开启「AI 自动连接」后可用,未开启时明确报错提示转人工 |
ssh_exec |
在当前服务器执行 Agent 命令(继承交互 shell 当前目录),回传退出码/输出/cwd/耗时/超时/截断/脱敏状态 |
ssh_read |
按需读取右侧终端缓冲输出(不静默塞入对话) |
ssh_write |
向指定终端写入交互输入;press_enter(默认 true)自动补回车提交(可传 connection_id 指定目标服务器的终端) |
ssh_disconnect |
断开当前连接及其 shell 会话 |
| 工具 | 用途 |
|---|---|
ssh_terminal_sessions |
列出已打开终端的低敏元数据与读取游标,不返回终端内容或凭据 |
ssh_terminal_context |
经每次用户确认后,按游标读取指定手动终端的有限、脱敏历史;不会影响右侧终端回看 |
| 工具 | 用途 |
|---|---|
sftp_list |
列出远程目录条目(含大小/mtime/权限) |
sftp_read |
读取远程文件内容(默认上限 4 MiB) |
sftp_write |
写入远程文件(创建或覆盖) |
sftp_mkdir |
新建远程目录 |
sftp_delete |
删除远程文件或空目录(不直接执行,改为把 rm -rf <路径> 加入待确认队列或返回可复制卡片) |
sftp_rename |
重命名/移动远程路径 |
sftp_upload_dir |
上传本地目录树到远程(自动建目录结构;小文件并发、大文件独占;单文件失败逐条上报不中断整批) |
sftp_download_dir |
下载远程目录树到本地(同上调度策略) |
| 工具 | 用途 |
|---|---|
tunnel_start |
建立本地转发(local,本机 → 服务器可达目标)或远程转发(remote,服务器 → 本机) |
tunnel_list |
列出活动隧道 |
tunnel_stop |
按 tunnel_id 停止隧道 |
| 工具 | 用途 |
|---|---|
ssh_batch |
基于 SSH 资源中已保存服务器(含未连接的)创建批量执行任务,由操作者在面板勾选确认后并发下发,结果按服务器分节;仅当用户明确要求多机批量时使用(旧的 ssh_cluster 已彻底移除,多机操作无免确认路径) |
| 工具 | 用途 |
|---|---|
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 # db-lazy-load 会在缺少 lib/ 时自动先构建宿主包
npm run build # 生成 lib/(宿主三件 + 客户端 bundle);lib 是构建产物,不入库
npm run pack:release
lib/ 目录由 npm run build 生成并列入 .gitignore(PR diff 因此不再被构建产物淹没)。从 git 直接安装(非 npm/tgz 渠道)需先执行 npm install && npm run build。
推送与 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.18.tgz:可直接被 DSH 安装。dsh-ssh-ops-0.3.18.zip:完整离线源码包。
![]() alexeyfadeev 双语引擎 💻 · 英文翻译 🌍 · 方案 💡 |
双语界面的模式引擎与其英文译词典底稿出自 alexeyfadeev 的 PR #26(经词典反转与宿主适配后随 v0.3.16 发布);自更新条适配自 @michengai/dsh-archive-manager(Apache-2.0)。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。