dsh-ssh-exec:在非交互 DSH 里用 ssh_exec 执行远程命令

前言

DeepSeek Harness(DSH)给 agent 提供的 shell 是非交互的:标准输入输出都会被重定向。在这种环境里,如果直接调用系统自带的 ssh,密码认证往往走不到终端接口,命令会长时间挂起,既不报错也不返回,最后被超时杀掉。管道把密码喂给 ssh 同样无效,OpenSSH 不会从 stdin 读密码。

偶尔需要在远程主机上跑一条命令、又不想把整个 DSH 会话迁到远端时,需要一种不依赖 tty、又能在进程内完成 SSH 认证的方案。下面介绍社区插件 dsh-ssh-exec(维护者 wsy320,分类:联网工具),它在 DSH 中注册独立工具 ssh_exec,用 ssh2 在进程内讲 SSH 协议,不调用 ssh 二进制,让密码认证在非交互环境下可用。

这是什么

dsh-ssh-exec 的定位很克制:只做一件事——注册 ssh_exec,让 agent 在没有交互终端的环境里登录远程主机执行命令。与同类插件 dsh-ssh 不同,本插件不接管 ctx.subprocess / ctx.fs,本机 pwsh 与文件工具照常可用;两者可以共存,也不会改变本地执行环境。当前 package 版本为 0.1.0,许可证 MIT。

核心功能

  • 工具名 ssh_exec:action 为 run(默认)时在指定主机执行 command;为 list 时列出主机表中的别名。
  • 认证方式:主机表里可配明文 password、passwordEnv(优先,从环境变量取密码)、privateKey / passphrase;未配私钥时回退 ~/.ssh/id_ed25519,再回退 SSH agent。
  • 跳板:主机项支持 via,指向另一别名,经 ssh2 forwardOut 连接。
  • 返回文本包含命令、stdout、stderr(非空时)、退出码;输出超过 maxOutput 会截断并标注。
  • 不认识的 host 参数会被当成字面主机名或 IP 直接连接。

安装与启用

官方 README 中的安装方式是把插件目录 link 进 profile 的 package.json,并在 node_modules 里建立符号链接(可参考已有 dsh-memory-vault 的做法),然后重启 DSH,工具列表里会出现 ssh_exec。

// ~/.dsh/profiles/<profile>/package.json
"dependencies": {
  "dsh-ssh-exec": "link:/path/to/dsh-ssh-exec"
},
"dsh": { "profile": { "bundles": [ /* … */ "dsh-ssh-exec" ] } }

依赖包括 @deepseek-ai/schemastery(^3.18.0)与 ssh2(^1.17.0),由插件包自行解析。

主机表与配置

默认读取 ~/.dsh/ssh_hosts.json,可用配置项 hostsFile 覆盖路径。

{
  "hosts": {
    "router": { "hostname": "192.168.1.1", "username": "root", "password": "…" },
    "nas":    { "hostname": "192.168.1.20", "username": "root", "passwordEnv": "NAS_PW",
                "via": "router" }
  }
}
字段 说明
hostname port username 连接目标;port 默认 22,username 默认 root
password / passwordEnv 明文密码或环境变量名;passwordEnv 优先
privateKey passphrase 私钥路径或 PEM 内容
via 跳板机别名

插件级配置:

字段 默认 说明
hostsFile ~/.dsh/ssh_hosts.json 主机表路径
defaultTimeout 120 默认超时(秒)
maxOutput 200000 单次返回最大字符数

典型用法

调用 ssh_exec 时主要参数如下:

参数 说明
action run 或 list
host 主机别名或 IP
command 要执行的命令(run 时必填)
timeout 超时秒数,默认取 defaultTimeout(120)

示例流程:先在 ssh_hosts.json 里为内网 NAS 配置 hostname、username 和 passwordEnv;agent 通过 host: "nas"、command: "df -h" 发起 run。若只需查看已配置别名,使用 action: "list"。

适用场景与注意

适合:偶尔登录远程机器执行命令、家用或内网设备维护、需要密码认证但 DSH 没有交互终端的场景。

与 dsh-ssh 的取舍:需要把整个远程开发工作区迁到 SSH 会话上时,应使用 dsh-ssh;只需要点对点执行远程命令且保留本机工具时,用本插件更合适。

已知限制(来自 README):

  • 每条命令独立建连,没有连接复用;高频调用有握手开销。
  • 不做主机指纹校验;严格场景需自行评估或等待 known_hosts 类支持。
  • 远程 pid 对 DSH 不可见,无法定点杀进程;长任务请设置 timeout。

安全:插件以当前 DSH 进程权限运行,主机表可能含密码或私钥路径;安装前建议阅读 GitHub 仓库 源码与 MIT 许可证,勿将含明文的 ssh_hosts.json 提交到版本库。

DSH 生态奉行「一切皆插件」;SkillHub 目录页 为社区收录,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-ssh-exec 用进程内 ssh2 补上 DSH 非交互 shell 下原生 ssh 密码认证失效的缺口,以独立工具 ssh_exec 提供可配置的远程命令执行,而不挪动本地工作区。更多信息见目录页与 GitHub:https://www.skillhub.cn/plugins/wsy320/dsh-ssh-exec、https://github.com/wsy320/dsh-ssh-exec。

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

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

Xiaoye