SSH Remote:在 DeepSeek Harness 里多机 SSH 运维工具带

前言

在 DeepSeek Harness(DSH)里让智能体操作 VPS,常见做法是把整段会话「搬到」远端:本地 shell、读文件、编辑都被远端替代,且往往一个工作区只绑一台主机。若你希望在同一轮对话里对 web1、db1 等多台机器分别执行命令或传文件,同时本地 bash / read / edit 仍处理本机代码,就需要另一类插件形态。

下面介绍社区插件 SSH Remote(npm 包名 dsh-plugin-ssh-remote,维护者 IVAN4242,分类 admin-security)。它提供主机注册表、/ssh 命令,以及 ssh_run、ssh_put、ssh_get 等工具,并默认附带破坏性命令拦截、密钥与令牌脱敏、审计日志。插件本身不内置任何服务器地址,由你自行登记,一次安装可对接任意数量的机器。

这是什么

SSH Remote 是面向 DSH 的多主机 SSH 工具带:调用系统自带的 ssh / scp,不重新实现协议,因此 ~/.ssh/config、known_hosts 与本地 ssh-agent 的行为与终端一致。源码体量小(README 称六个源文件、无构建步骤),与「整 workspace 远端化」的 dsh-ssh、dsh-remote-ssh、dsh-ssh-ops 等插件定位不同;若需要远端文件编辑、终端面板或 LSP,应选用那些方案。

当前版本 0.1.0(MIT),在 Harness 0.2.1-rc.3 上测试;engines.dsh 声明为 >=0.2.1-rc.3 <0.3.0。DSH 处于开发者预览阶段,版本间可能不兼容,运行环境宜固定 Harness 版本。

核心功能

主机注册与 /ssh

  • 注册表即白名单:默认只有已登记的主机名可连;allowRawHosts 默认为 false。
  • 认证优先使用已配置的密钥;若无密钥,可使用 /ssh pass 保存密码(存于 $DSH_HOME/ssh-remote-secrets.json)。
  • /ssh sync 可从 ~/.ssh/config 导入主机;也可用 /ssh add 手工添加。

智能体工具

工具 作用 限制(摘自 README)
ssh_run 远程执行命令,返回 stdout、stderr、退出码 受命令策略、timeoutMs、tty 等约束
ssh_read 按行窗口读文件 offset 从 1 起,limit ≤ 2000
ssh_ls 列目录 最多 200 条;long: false 仅文件名
ssh_grep 搜文件内容 maxMatches ≤ 1000,跳过二进制
ssh_glob 按名找文件 maxResults ≤ 2000
ssh_put / ssh_get 上传或下载单个文件 本地路径不受 DSH 沙箱限制
ssh_hosts / ssh_host_add / ssh_host_remove 管理注册表 变更前会要求确认

同一 session 内可对不同 host 调用 ssh_run,本地工具仍可用于本机文件。

安全与审计

  • Host key:始终 StrictHostKeyChecking=yes;密钥变更会中止并需你自行核对指纹。
  • 无交互:密钥模式 BatchMode=yes;密码模式仅一次尝试,避免命令挂起等待输入。
  • 命令策略(默认 commandPolicy: standard):灾难性命令(如 rm -rf /、mkfs、对设备的 dd、shutdown 等)在进程启动前拒绝,即使用 sudo / nohup / sh -c 包装;可逆性较低但合法的操作(如对绝对路径的 rm -rf、apt purge、DROP DATABASE 等)会弹窗确认一次。策略基于文本匹配,不执行脚本语义分析;README 明确建议用无 sudo 的专用账号,root 留作人工操作。
  • 脱敏:私钥块、AWS 密钥、sk-…、JWT、password= / token= / Authorization: Bearer 等会在模型看到前替换为 redacted:<kind>。
  • 审计:每次客户端调用一行 JSON 写入 $DSH_HOME/ssh-remote-audit.jsonl(命令已脱敏),约 10 MB 轮转。

/README 还说明:不支持 ProxyJump 链(可依赖 ~/.ssh/config 同步后由 OpenSSH 处理);Windows 上无连接复用(multiplex: true 仅 POSIX 本地端有效);无远端终端、远端编辑与 LSP。

安装与启用

环境要求:Node >= 22,DSH >= 0.2.1-rc.3(且 <0.3.0)。除系统已有的 ssh / scp 外无额外运行时依赖。

从 npm 安装(官方 README 命令):

dsh plugin --profile web add dsh-plugin-ssh-remote

本地开发可从 checkout 安装:

plugin_manager action=install_bundle target=<absolute path to this folder>

安装后通过 /ssh sync 或 /ssh add 添加服务器。插件以当前 DSH 进程的用户权限运行;安装前宜自行查看 GitHub 仓库 源码与 MIT 许可证。

典型用法

/ssh 子命令

/ssh                  # 列出服务器;从列表选择
/ssh web1             # 测试连接(不设默认)
/ssh default web1     # 设为默认主机
/ssh status           # 策略、登录方式、默认主机
/ssh add              # 手工添加
/ssh sync             # 从 ~/.ssh/config 导入
/ssh pass web1 <pass> # 无密钥时保存密码
/ssh nopass web1      # 删除已存密码
/ssh lock web1        # 禁止对该主机的一切操作
/ssh unlock web1      # 恢复
/ssh remove web1      # 从注册表移除

快速连通性检查

/ssh add
/ssh pass web1 <pass>   # 仅在该机尚无密钥时需要
/ssh test web1

之后可直接用自然语言让智能体操作,例如检查 web1 磁盘占用、tail nginx 错误日志,或将本地 ./dist.tar.gz 传到 web1 并在 /srv/app 解压(具体由 ssh_run / ssh_put 等完成)。

配置要点

配置项完整说明见仓库内 profile-patch-snippet.yml。注意:profile 级 patch 替换整段 config 而非合并,需列出要保留的全部键。

键 默认值 含义
registryPath $DSH_HOME/ssh-remote-hosts.json 主机注册表
secretsPath $DSH_HOME/ssh-remote-secrets.json 保存的密码
auditLogPath $DSH_HOME/ssh-remote-audit.jsonl 操作日志
allowRawHosts false 是否接受未注册地址
connectTimeoutMs 10000 连接超时
defaultTimeoutMs 120000 默认命令超时
maxOutputChars 60000 单流输出上限(保留头尾)
commandPolicy standard off 时不再询问不可逆命令,灾难性命令仍拒绝

适用场景与注意

适合:在同一 DSH 会话中运维多台 VPS;希望沿用现有 OpenSSH 配置与 agent;需要默认的命令拦截、输出脱敏与审计,而不是完整远端 IDE 体验。

注意:

  1. ssh_put 可读本地用户能访问的任意文件,不受 DSH 本地沙箱约束;传文件会记入审计日志。
  2. 命令策略不能替代最小权限账号与人工复核;复杂 shell 或先上传再执行的脚本可能绕过文本规则。
  3. 与「整 workspace SSH」类插件二选一即可,避免重复叠加重型远端能力。

结尾

SSH Remote 把多主机 SSH 收成 DSH 内的一组工具与 /ssh 管理面,本地开发流与远端运维可并行。社区目录页:skillhub.cn/plugins/IVAN4242/dsh-plugin-ssh-remote;源码与文档:github.com/IVAN4242/dsh-plugin-ssh-remote。目录站点为社区维护,与 DeepSeek / 幻方无官方从属关系;安装与授权决策请以你本地 Harness 版本及仓库说明为准。

羽毛球分组比赛记分
小程序二维码

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

小夜