dsh-plugin-tool-gaming-host
一个允许agent借助gaming程序直接访问宿主机的插件。日后或许会搞个网页版,把gaming改成bwrap然后允许传参什么的,但现在,这个库只有最基础的功能
- Stars
- 0
- Language
- Rust
- Created
- Sep 10, 2026
- Updated
- Sep 10, 2026
Introduction
gaming-runner + host_exec —— 让 DSH 沙箱 agent 调用宿主机程序
DSH 把 agent 的 bash 关在 Landlock 沙箱里,沙箱里的 agent 调不动需要宿主
资源的程序(GPU / 图形 / 宿主配置)。本仓库提供一个完整的桥:
┌───────────────────── DSH agent (sandbox, Landlock) ─────────────────────┐
│ bash: hrexec ./x.sh 或 原生工具 host_exec {script|path, ...} │
└───────────────────────────────┬──────────────────────────────────────────┘
│ HTTP+JSON, 127.0.0.1:9955 (token 可选)
┌───────────────────────────────▼────────────── 宿主侧(无 Landlock)─────┐
│ gaming-runner (Rust daemon, systemd 常驻) │
│ 1. 收脚本 → 写 /tmp/hrexec-*/run.sh + wrap.sh │
│ 2. cd 工作目录 → /usr/bin/gaming ./wrap.sh <args> (bubblewrap 隔离) │
│ 3. 真实退出码经 wrap.sh 写回 rc 文件;stdout/stderr 捕获、超时强杀 │
└──────────────────────────────────────────────────────────────────────────┘
gaming 负责「隔离宿主敏感文件」的边界;runner 只是把沙箱 agent 的请求安全
地转成宿主侧的 gaming 调用,从而能用上宿主为 gaming 开放的能力(例如
gaming-gpu 提供的显卡访问)。
目录
| 路径 | 内容 |
|---|---|
gaming-runner/ | Rust 守护进程(nightly + edition 2024):源码、deploy/(systemd unit + install.sh)、README |
bin/hrexec | Python 客户端:沙箱 agent 一行命令执行宿主脚本;零依赖(标准库) |
dsh-plugin-tool-gaming-host/ | DSH 原生工具插件(host_exec):src/ 源码、预构建 lib/、INSTALL.md |
install-to-dsh.sh | 安装器:把插件装进 $DSH_HOME 运行时树并在 preset 挂载(幂等,支持 --uninstall) |
README.md | 本文件 |
快速开始
# 1. 构建 runner(本机 nightly/2024;依赖 serde_json)
cd gaming-runner && cargo build --release
# 2. 宿主机上启动(示例,正式用 systemd:sudo ./deploy/install.sh)
./target/release/gaming-runner --listen 127.0.0.1:9955 &
# 3. 冒烟测试
curl -s http://127.0.0.1:9955/health
printf '#!/bin/bash\necho 123\nexit 7\n' > /tmp/t.sh
../bin/hrexec -- /tmp/t.sh; echo "exit=$?" # stdout=123, exit=7
# 4. 在 agent 会话里(任意任务)用客户端跑需要宿主能力的脚本:
/me/caller/bin/hrexec --env DISPLAY=:0 -- ./gpu-tool.sh --frames 100
三种 agent 集成方式对比
| 方式 | 改动 | 生效时机 | 适用 |
|---|---|---|---|
bin/hrexec(bash 调) | 无(脚本放 PATH/workspace) | 立即,任意会话 | 生产打包部署、验证阶段 |
原生工具 host_exec(./install-to-dsh.sh) | 写入 $DSH_HOME 运行时树 + preset 行 | 重启 host 后新会话 | 想让模型原生可见 |
| 自写 HTTP 客户端 | 无 | 立即 | 按 gaming-runner/README.md 协议自接 |
install-to-dsh.sh把插件装进$DSH_HOME/profiles/node_modules/@deepseek-ai/(host 解析 preset 插件名的运行时树),不改动deepseek-harness源码仓库。
安全模型(务必读)
- 信任链:runner(宿主用户)+
gaming隔离 ≈ 一个「宿主机上的 gaming 执行入口」。能连上端口的 agent 等于被授予该权限;gaming不暴露的敏感 文件,agent 依旧看不到。 - runner 默认只绑
127.0.0.1;--token可拦同机其他用户;并发/超时/体积 都有上限(--concurrency、--timeout、--max-body/out)。 - wrapper(
gaming/gaming-gpu)是部署决策,调用方不能覆盖;需要 显卡就给 GPU 单独起实例、单独端口/信任层。 - agent 沙箱的
/tmp每次调用私有:写临时文件请用 workspace(/me/...等 与宿主共享的路径),这也是path模式能直接跑 workspace 脚本的原因。
测试与验证状态
在本机已完成端到端验证:健康检查、内容/路径模式、args/env/cwd、真实退出码
透传、超时强杀、参数冲突校验、hrexec 文件/--stdin/--run-path、ANSI 输出
剥离。gaming 的真实退出码语义(自身恒 0、子进程状态打在 stderr)已通过
wrap.sh + rc 文件绕开,不依赖解析它的文本输出。
关于本机环境的适配说明
- 本会话的
$HOME/.cargo与/usr/lib/rustup只读:用CARGO_HOME/RUSTUP_HOME指向可写目录构建(rustup toolchain install stable一次即可),工程按宿主配置用 nightly + edition 2024。 - 在真正的宿主机上把
deploy/install.sh跑一遍即可常驻,供此后所有任务复用。