dsh-plugin-remote-ssh: Enable DSH to Control Remote Hosts via SSH

前言

在 DSH 里做运维、部署或排查问题时,智能体往往只能操作本机环境。远程机器上的日志、服务状态、构建命令,要么你手动复制粘贴,要么另开终端 SSH 进去再口述结果。DeepSeek Harness 的插件机制允许把「连哪台机、怎么执行命令」做成 Host 侧服务与 Agent 工具;dsh-plugin-remote-ssh 走的就是这条路:用本机 OpenSSH 客户端连远端,并在 设置 → SSH 主机 里维护主机清单,不存密码与私钥内容。

下面介绍该插件的定位、能力、安装方式与使用时需要注意的安全边界。

这是什么

dsh-plugin-remote-ssh 是维护者 pelucoola 发布的 DSH 客户端类插件(当前 GitHub 星标为 0)。一句话:让 DSH 通过 SSH 控制远程主机——智能体获得 ssh / ssh_hosts 工具(连接复用、自适应超时),设置页统一管理已保存主机(增删改查、测试连接)。认证完全交给本机 ssh 客户端(ssh-agent、~/.ssh/config 或条目里指定的私钥路径);Host 与浏览器两半都不 import 任何 @deepseek-ai/dsh-* 包,只依赖运行时 Cordis Context。

插件目录页:https://www.skillhub.cn/plugins/pelucoola/dsh-plugin-remote-ssh
源码与说明:https://github.com/pelucoola/dsh-plugin-remote-ssh(MIT,package 版本 0.2.0)

核心功能

智能体工具

  • ssh:在已保存的主机上执行命令,支持 cwd、stdin;返回 exitCode / stdout / stderr。host 可填主机 id 或名称;host 与 command 都省略时返回主机清单。
  • ssh_hosts:对已保存主机做 List / Get / Add / Update / Remove / Test / Disconnect,与设置页调用同一套 sshHosts 服务。

连接复用与超时

同一 DSH 进程内,对同一主机的多次调用复用一条后台 OpenSSH ControlMaster 连接(首次握手,之后响应更快;空闲 sessionPersistSeconds 秒后自动回收)。Windows OpenSSH 不支持复用时插件会自动关闭该能力。

timeoutMs 是静默超时:只要命令还有 stdout/stderr 输出就会续命,长时间构建/部署不会被默认 60 秒误杀;另有 maxTimeoutMs 硬上限兜底。返回值中的 timeoutKind(none / idle / total)和 sessionReused 说明本次结果来源。

设置界面

设置 → SSH 主机 支持新增 / 编辑 / 删除 / 测试连接,字段包括用户、端口、私钥文件路径、ProxyJump、备注。测试连接会执行 printf 'ok'; uname -srm 并显示延迟与系统信息;删除需点两次(第二次为「确认删除」)。

持久化与实现要点

主机清单写入 $DSH_HOME/ssh-hosts.json(权限 0600,原子写)。复用连接的 socket 在 $DSH_HOME/ssh-masters/ 下按连接参数哈希命名。设置页通过 /api RPC 调用 Host 侧的 sshHosts,与 Agent 工具共用实现。

安装与启用

不需要 npm 账号,从 GitHub 安装(README 推荐方式):

dsh plugin --profile desktop add git+https://github.com/pelucoola/dsh-plugin-remote-ssh.git

也可在 DSH「插件 → 添加插件」里粘贴同一 Git 地址。锁定到某次提交时:

dsh plugin --profile desktop add git+https://github.com/pelucoola/dsh-plugin-remote-ssh.git#<40位commit>

Release 压缩包见 https://github.com/pelucoola/dsh-plugin-remote-ssh/releases,可从本地路径安装。开发时可对仓库绝对路径执行:

dsh plugin --profile desktop add /绝对路径/dsh-plugin-remote-ssh

本地目录安装会以 link: 写进 profile;改 Host/Client 代码后需重新 install_bundle 或重启 DSH 才会加载新模块。

卸载时调用 plugin_manager / remove_bundle,target = dsh-plugin-remote-ssh;$DSH_HOME/ssh-hosts.json 不会被自动删除。

配置

在 profile 的 cordis.patch.yml 里覆盖 bundle 行 id: ssh-hosts 的 config(未知键会导致挂载失败,不会静默忽略拼写错误):

- id: ssh-hosts
  name: dsh-plugin-remote-ssh
  config:
    sshBinary: ssh              # 默认 ssh,走 PATH
    connectTimeoutSec: 10       # 1-120
    defaultTimeoutMs: 120000    # 静默超时:多久没有输出就终止(1000-86400000)
    maxTimeoutMs: 3600000       # 单次调用硬上限(60000-86400000)
    maxOutputBytes: 200000      # 每个流截断阈值,4096-8MiB
    reuseSession: true          # 复用后台 SSH 连接
    sessionPersistSeconds: 300  # 连接空闲多久后回收(0-86400)

典型用法

设置页

  1. 打开 设置 → SSH 主机,「添加主机」填写名称与主机地址(必填),其余可选。
  2. 使用「测试连接」确认可达性与延迟。
  3. 需要时在界面删除条目(二次确认)。

智能体调用示例

列出或执行命令:

ssh(host: "prod-web", command: "systemctl status nginx", cwd: "/srv")
ssh()                                   # 列出已保存主机
ssh_hosts(action: "add", name: "prod-web", host: "10.0.0.5", user: "root")
ssh_hosts(action: "test", id: "prod-web")

长任务与断开复用连接:

ssh(host: "prod-web", command: "npm run build", timeoutMs: 600000)
ssh_hosts(action: "disconnect", id: "prod-web")

复用连接不保留远端交互式 shell 状态(例如单独 cd);每次调用仍是独立命令,工作目录用 cwd 或写进命令。

适用场景与注意

适合:已在 DSH Desktop 上使用智能体做远程运维、部署、日志与状态检查,且本机已配置好公钥或 ssh-agent 的场景。

务必知晓:

  • 插件以当前 DSH 进程权限运行;远程命令能力等同于该 SSH 账号在远端拥有的权限。安装前应阅读源码与 MIT 许可证,确认符合你的安全策略。
  • 所有 ssh 调用固定 -o BatchMode=yes,不会弹出交互式密码;需密码登录的主机请先配置公钥(如 ssh-copy-id)。新主机建议先在终端手动 ssh 一次或自行管理 known_hosts。
  • Agent 可调用 ssh_hosts 修改主机清单。若不希望模型自行添加主机,可在 profile 里停用插件或收紧工具权限。
  • 社区目录 skillhub.cn 是独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本插件也可直接通过上述 dsh plugin add 安装。

仓库内另有中文推广文档 docs/promo-zh.md(安装、使用、/var 清理示例、安全设计),可作为延伸阅读。

结尾

dsh-plugin-remote-ssh 把「保存 SSH 主机」和「在 Agent 里远程执行命令」收进同一套 DSH 插件:设置页与工具共享实现,连接复用与静默超时针对真实运维任务做了约束。需要试用时,从 GitHub 安装命令或目录页进入即可。

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

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

Xiaoye