关键词:安全执行|沙箱隔离|Docker|权限提升|用户审批|环境注入
在 AI 智能体系统中,工具调用(Tool Calling)是实现“行动能力”的核心。而其中最强大也最危险的能力,莫过于执行任意 Shell 命令——它能让 AI 重启服务、部署代码、分析日志,但也可能被滥用为“删库跑路”的入口。
OpenClaw 的 src/agents/bash-tools.exec.ts 模块,正是为解决这一矛盾而生。它没有简单地暴露 child_process.exec,而是构建了一套三层隔离模型(Three-Layer Isolation Model),在提供强大功能的同时,将风险控制在可接受范围内。
本文将详解这三层模型的设计原理、实现机制与安全边界。

信任 AI 的推理,不等于信任它的输出。
OpenClaw 的哲学是:AI 可以“提议”执行命令,但人类必须保留“否决权”。
OpenClaw 将命令执行环境分为三个层级,按安全强度递增:

用户可通过 host 参数指定执行位置:
tools:
- name: "list_files"
command: "ls -l {{path}}"
host: "sandbox" # ← 关键配置默认即安全:若未指定,一律使用 L1 沙箱。
// exec.ts
async function runInSandbox(cmd: string, args: string[]): Promise<ExecResult> {
const image = "openclaw/sandbox:latest"; // 基于 alpine + coreutils
const container = await docker.createContainer({
Image: image,
Cmd: [cmd, ...args],
HostConfig: {
NetworkMode: "none", // 禁用网络
AutoRemove: true, // 执行完自动删除
Memory: 128 * 1024 * 1024, // 128MB 内存限制
CpuPeriod: 100000,
CpuQuota: 50000, // 限制 50% 单核 CPU
Binds: [], // 不挂载任何主机目录
CapDrop: ["ALL"], // 放弃所有 Linux 能力
SecurityOpt: ["no-new-privileges"]
}
});
await container.start();
const logs = await container.logs({ stdout: true, stderr: true });
await container.wait(); // 等待退出
return parseLogs(logs);
}curl、wget 等命令无效适合:纯计算、文本处理、代码 lint 等无副作用操作。
当命令需要访问本地资源(如项目目录、Docker Daemon),可降级到 L2。
host: "gateway"# config.yaml
bashTools:
elevatedWhitelist:
- "git status"
- "npm run build"
- "docker ps"
- "kubectl get pods"若命令不在白名单(如
rm -rf),即使指定host: gateway也会被拒绝。
工作目录限制:仅允许在 allowedPaths 下操作
allowedPaths:
- "/home/user/projects"
- "/opt/openclaw/data"PATH 注入:仅包含安全命令(/usr/bin:/bin,排除 /usr/local/bin)
环境变量清理:移除 SSH_AUTH_SOCK、AWS_SECRET_ACCESS_KEY 等敏感变量
tool_call: bash_exec(cmd="npm run deploy")elevated 权限npm run deploy
路径:/home/user/my-app
确认 拒绝”
人类是最后一道防线。
在多服务器环境中,命令可能需在特定机器执行(如“在 staging 服务器上重启服务”)。
openclaw-agent 守护进程remoteNodes:
staging:
host: "10.0.1.100"
user: "deployer"
allowedCommands: ["systemctl restart app"]
prod-db:
host: "10.0.2.200"
user: "dbadmin"
allowedCommands: ["pg_dump --dbname=mydb"]适合:DevOps 自动化、跨环境部署等企业场景。
即使在沙箱中,仍需防御命令构造漏洞。
所有参数经 shellEscape() 处理:
function shellEscape(str: string): string {
if (/^[a-zA-Z0-9._/-]+$/g.test(str)) return str;
throw new Error("Unsafe characters in parameter");
}禁止 ;, |, &, $(), ` 等 shell 元字符
不信任任何来自 LLM 的字符串。

exec.ts 的三层隔离模型,体现了 OpenClaw 对“AI 行动力”的审慎态度:
它不阻止 AI 做事,而是确保每一步都在人类知情与授权下进行。
在下一篇中,我们将继续深入
exec.ts的下半部分,解析后台任务管理、权限提升控制与实时交互机制。
下一篇预告:
第 11 篇:exec.ts 下篇 —— 用户审批、后台任务与权限提升控制