前言¶
在 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 体验。
注意:
ssh_put可读本地用户能访问的任意文件,不受 DSH 本地沙箱约束;传文件会记入审计日志。- 命令策略不能替代最小权限账号与人工复核;复杂 shell 或先上传再执行的脚本可能绕过文本规则。
- 与「整 workspace SSH」类插件二选一即可,避免重复叠加重型远端能力。
结尾¶
SSH Remote 把多主机 SSH 收成 DSH 内的一组工具与 /ssh 管理面,本地开发流与远端运维可并行。社区目录页:skillhub.cn/plugins/IVAN4242/dsh-plugin-ssh-remote;源码与文档:github.com/IVAN4242/dsh-plugin-ssh-remote。目录站点为社区维护,与 DeepSeek / 幻方无官方从属关系;安装与授权决策请以你本地 Harness 版本及仓库说明为准。