dsh-ssh-plugin:给 DSH 智能体用的 SSH 能力

前言

DeepSeek Harness(DSH)的理念是「一切皆插件」,智能体要直接操作服务器,需要 SSH 能力。市面上常见的做法要么让模型自己拼 ssh 命令,要么把密钥放在模型上下文里,都不够安全。

dalld/dsh-ssh-plugin 是为 DSH 智能体提供的 SSH 插件,支持执行命令、上传下载文件,核心是让私钥/口令不进入模型上下文,只在 Host 进程里解析。插件自带侧栏面板,提供主机管理、连接测试与日志、命令黑名单、危险命令策略、审计记录。

它解决什么问题

让智能体能直接操作服务器(部署、排障、传文件),但模型永远看不到密钥:

角色 能看到什么
模型 / 对话 只有主机别名(如 9929)和命令输出
浏览器面板 别名、地址、认证引用名(环境变量名 / 凭据名 / 私钥路径),不回显密钥内容
Host 进程 真正的私钥与口令;只在本机内存里用于握手

核心功能

  • 执行命令:ssh_exec 工具,支持 stdin、cwd、超时、输出上限
  • 文件传输:ssh_put / ssh_get,支持递归目录、verify 对比 sha256
  • 主机管理:侧栏面板,搜索、过滤、新增、编辑、删除主机
  • 连接测试与日志:真实的 SSH 连接测试,输出详细日志(握手、指纹、认证、执行)
  • 命令黑名单:正则可增删,内置 20 条规则(含 PowerShell 规则)
  • 危险命令策略:dangerPolicy: deny | ask | allow,命中黑名单时拒绝 / 转 DSH 审批 / 放行
  • 主机只读模式:mode: readonly 拒绝写操作
  • TOFU 指纹:accept-new 下首次连接成功即记录指纹,之后每次比对;不一致直接拒绝连接
  • 审计记录:<dataDir>/audit.jsonl(0600)记录 exec/put/get/probe 的时间、退出码、耗时、脱敏命令

安装与启用

插件依赖仅 ssh2;缺失时自动降级到系统 OpenSSH 客户端。

环境要求

项 要求
DSH ≥ 0.2.1-rc.2
Node ≥ 20(DSH 自带)
系统 Windows 10+ / macOS / Linux

方式 A:拷贝自带依赖的目录(推荐,离线可用)

在有网络的机器上先构建一次:

git clone https://github.com/Dalld/dsh-ssh-plugin.git
cd dsh-ssh-plugin
npm install --omit=dev --ignore-scripts
npm run prepare:dist        # 产物:dist/dsh-ssh-plugin

把 dist/dsh-ssh-plugin 整个目录拷到目标机,然后在目标机 DSH 里:

plugin_manager install_bundle D:\dsh-plugins\dsh-ssh-plugin

目录安装走 link:,不会重装依赖,不会触发构建审批,适合离线/内网。

方式 B:直接指向源码目录(开发用)

git clone https://github.com/Dalld/dsh-ssh-plugin.git
cd dsh-ssh-plugin
npm install --omit=dev --ignore-scripts   # ssh2 纯 JS 即可,不需要编译
plugin_manager install_bundle <仓库绝对路径>

方式 C:npm 一条命令

plugin_manager install_bundle dsh-ssh-plugin

目标机安装时 pnpm 会自动装 ssh2,首次可能提示 pendingBuilds: cpu-features, ssh2(可选原生加速模块)。允许即可;不允许也能用,插件自动退回 OpenSSH 后端。

安装完成后刷新 DSH 页面,左侧栏会出现 SSH 图标。

典型用法

加主机

面板「新增」→ 填别名/地址/用户 → 认证方式选「直接粘贴私钥」或「直接输入密码」→ 测试连接 → 保存。

让智能体干活

在对话里说:

连接 9929,帮我部署这个服务 https://github.com/xxx/yyy

模型会自己调用 ssh_hosts / ssh_exec / ssh_put,全程只用别名。

配置参考

配置写在插件行的 config(YAML),或让面板写 <dataDir>/settings.json(面板优先级更高,即时生效)。

config:
  transport: ssh2            # ssh2 | openssh | auto
  hostKeyPolicy: accept-new  # accept-new | strict | off
  dangerPolicy: deny         # allow | ask | deny
  audit: true
  multiplex: false           # 仅 OpenSSH 后端(POSIX)
  defaultTimeoutMs: 30000
  connectTimeoutMs: 20000
  maxOutputBytes: 200000
  hosts:
    - alias: prod
      host: 1.2.3.4
      port: 22
      user: root
      keyCred: DSH_SSH_PROD_KEY   # 面板粘贴私钥后自动生成的引用名
      mode: readonly              # default | readonly
      group: prod
    - alias: winbox
      host: 10.0.0.12
      user: Administrator
      keyPath: C:\Users\me\.ssh\id_ed25519
      shell: powershell           # posix | powershell | cmd

单主机可选:keyEnv keyPath keyCred passphraseEnv passwordEnv passwordCred agent timeoutMs connectTimeoutMs maxOutputBytes defaultCwd shell mode group enabled。

数据目录

<profile>/ssh/:hosts.json、known_hosts、settings.json、audit.jsonl、cm/(OpenSSH 复用套接字)。

迁移到新机器时,前三个文件可整目录拷贝;凭据库里的密钥/密码不可迁移,需要重填,或改用 keyPath / keyEnv。

工具(模型可见)

工具 作用
ssh_hosts 列出别名、认证方式、只读/分组、已记录指纹;probe: true 真实连接
ssh_exec 执行命令(支持 stdin、cwd、超时、输出上限)
ssh_put / ssh_get 上下传;recursive 传目录,verify 比对 sha256
ssh_doctor 诊断:可用传输层与版本、数据目录、known_hosts、逐主机就绪情况

参数 schema 里没有任何密钥字段 —— 模型能给的最敏感情报只是一个别名。

适用场景与注意

适合需要智能体直接操作远程服务器、同时希望密钥不进入模型上下文的场景。

注意:黑名单与只读模式是模式匹配,不是沙箱,能被绕过。不要当作安全边界。

插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。

总结

dsh-ssh-plugin 在「智能体可用」与「密钥隔离」之间给出了一个实用的折中:模型通过工具操作服务器,私钥只在 Host 进程里解析,出口统一脱敏。配合 TOFU 指纹、命令黑名单、只读模式、审计日志,可以满足大多数内部运维场景的需求。

  • 插件目录页:https://www.skillhub.cn/plugins/Dalld/dsh-ssh-plugin
  • GitHub:https://github.com/Dalld/dsh-ssh-plugin
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜