前言¶
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,指向另一别名,经 ssh2forwardOut连接。 - 返回文本包含命令、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。