dsh-shell-exec
DSH 动态 Cordis 插件:通过 harness shell 服务在 Windows 本地终端执行 shell 命令,并为模型注册 shell 工具。
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗dsh-shell-exec
DSH 动态 Cordis 插件:通过 harness 的 shell 服务在 Windows 本地终端 执行 shell 命令,并为模型注册一个名为 shell 的动态工具。
功能
- 注册模型可见的动态工具
shell,模型可以直接调用它在当前 Windows 机器上执行任意命令(文件、进程、git、npm 等)。 - 支持三个参数:
command(必填)、workdir、timeoutMs。 - 输出渲染与 harness 自带 shell 工具一致:stdout 正文 +
[stderr]段 + 退出标记([exit code: N]/[killed by signal: ...]/[timed out after Nms])。 - 基于 harness 的
shell服务(ctx.get('shell')→resolve→run),Windows 下经 PowerShell 执行,无需引入任何外部依赖。
目录结构
dsh-shell-exec/
├── src/
│ └── host.js # Host 半区源码(cordis_define 的 code.host 直接粘贴此文件内容)
├── scripts/
│ └── check.js # 语法自检(npm run check)
├── package.json
├── plugin.json # 插件元数据(文档用途)
├── README.md
├── LICENSE # MIT
└── .gitignore
快速开始(在 DSH Web GUI 中加载)
- 在 DSH Web 的对话中让模型执行
cordis_define:plugin.kind=new,idPrefix填she;code.host粘贴src/host.js的完整内容;- 也可以直接把本文件路径交给模型,让它读取并粘贴。
- 用返回的
pluginId/packageId执行cordis_run(mode =run)激活插件。 - 激活后,模型即可调用
shell工具执行本地命令。
使用示例
模型调用 shell 工具时,参数形如:
{
"command": "dir",
"workdir": "C:\\Users\\godeyes\\Documents\\dsh"
}
返回结构:
{
"ok": true,
"exitCode": 0,
"signal": null,
"timedOut": false,
"timeoutMs": 30000,
"stdout": "...",
"stderr": "",
"text": "..."
}
工具参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
command | string | 是 | 要执行的 shell 命令行,例如 dir、git status |
workdir | string | 否 | 命令的工作目录,缺省使用 harness 配置的工作区 |
timeoutMs | number | 否 | 超时毫秒数;执行器会做上限截断,缺省使用实现配置的默认值 |
工作原理
harness.defineTool({...})定义动态工具(参数使用 Cordis 参数 DSL,输出 schema 为{ type: 'json' })。harness.registerTool(ctx, tool)注册到当前 Fiber,插件停止/更新时自动注销。- 执行路径:
shell.resolve(request)→shell.run(spec),其中request.signal透传工具执行的取消信号。 ShellRunResult包含exitCode/signal/timedOut/timeoutMs/stdout/stderr,插件将其渲染为模型可见文本。
已知限制:沙箱执行上下文与 Schannel TLS
插件注册的 shell 工具与 harness 自带的 pwsh 工具共用同一个沙箱执行上下文(受限进程环境,如 CODEX_SANDBOX_NETWORK_DISABLED=1 等托管变量所示)。该上下文对进程有额外限制,实测影响如下:
| 工具 | 沙箱内行为 |
|---|---|
curl.exe(默认 schannel 后端)、PowerShell Invoke-WebRequest / Invoke-RestMethod、npm 等走 SSPI/Schannel 的 HTTPS 客户端 | ❌ 报 schannel: AcquireCredentialsHandle failed: SEC_E_NO_CREDENTIALS (0x8009030E),对所有域名一致 |
走 OpenSSL 后端的工具(如 git 配置了 http.sslBackend openssl) | ✅ 正常,可完成 TLS 握手与推送 |
证书存储枚举(Cert:\CurrentUser\My 等) | ✅ 正常 |
要点:
- 这是沙箱固有行为,不是插件 bug。 同一台机器上,在普通终端(非沙箱)里同样的 schannel 请求全部正常;问题只出现在 harness 会话的沙箱进程上下文中,原因是 Schannel 凭据获取被受限上下文卡死(发生在任何网络请求之前)。
- 与本机注册表
SecurityProviders被截断无关——那是另一个独立问题,影响的是 LSA 模式包(Kerberos / NTLM / CredSSP / PKU2U,即域认证、SMB、RDP 等),不影响用户态 Schannel。 - 规避方式:在命令里使用 OpenSSL 后端的工具即可,例如
git -c http.sslBackend=openssl push,或对 curl 使用--ssl-no-revoke之外的替代方案(如wget/ OpenSSL 后端)。
开发
npm run check # 语法自检(把 src/host.js 作为函数体编译,不执行)
仓库
远程仓库:https://github.com/osmondlee/dsh-shell.git