exec 是一个会修改环境的 shell 接口:命令可以在所选主机或沙箱文件系统允许的任何位置创建、编辑或删除文件。禁用 OpenClaw 文件系统工具(如 write、edit 或 apply_patch)并不会让 exec 变成只读。
支持通过 process 进行前台和后台执行。如果 process 被禁止,exec 将同步运行并忽略 yieldMs/background。后台会话按代理划分作用域;process 只能看到来自同一代理的会话。
参数
string
required
要运行的 Shell 命令。
string
default:"cwd"
命令的工作目录。
object
在继承环境之上合并的键/值环境覆盖项。
number
default:"10000"
在此延迟(ms)后自动将命令切换到后台。
boolean
default:"false"
立即将命令置于后台,而不是等待
yieldMs。number
default:"tools.exec.timeoutSeconds"
覆盖此调用配置的 exec 超时时间,单位为秒。请注意,同级的
yieldMs 使用毫秒,而 process 工具中名称相同的 timeout 也使用毫秒——请传递 timeoutSeconds,以便在调用位置明确单位。适用于前台、后台、yieldMs、gateway、sandbox 以及 node system.run 执行。timeoutSeconds: 0 会为该调用禁用 exec 进程超时。boolean
default:"false"
在可用时于伪终端中运行。用于仅支持 TTY 的 CLI、编码 agent 和终端 UI。
'auto' | 'sandbox' | 'gateway' | 'node'
default:"auto"
在哪里执行。
auto 在沙箱运行时处于活动状态时解析为 sandbox,否则解析为 gateway。'deny' | 'allowlist' | 'full'
常规工具调用会忽略。
gateway/node 安全性由 tools.exec.mode 和主机批准文件决定;提升模式只有在操作员明确授予提升访问权限时,才能强制使用 full 访问。'off' | 'on-miss' | 'always'
基线 ask 模式由
tools.exec.mode 和主机批准决定。对于 channel-origin 模型调用,当有效主机 ask 为 off 时,每次调用的 ask 会被忽略;否则它只能收紧为更严格的模式。string
当
host=node 时的节点 id/名称。boolean
default:"false"
请求提升模式:从沙箱逃逸到已配置的主机路径。仅当提升结果解析为
full 时才会强制 security=full。host仅接受auto、sandbox、gateway或node。它不是主机名选择器;在命令运行前,类似主机名的值会被拒绝。- 每次调用都可以从
auto使用host=node;每次调用的host=gateway仅在没有活动的沙箱运行时才允许。 - 在没有额外配置的情况下,
host=auto仍然“可直接工作”:没有沙箱时会解析为gateway;有运行中的沙箱时则保持在沙箱中。 elevated会将沙箱逃逸到已配置的主机路径:默认是gateway,或者当tools.exec.host=node时为node(或会话默认值为host=node)。仅当当前会话/提供方启用了提升访问时才可用。gateway/node的批准由主机批准文件控制。node需要配对的节点(伴侣应用或无头节点主机)。如果有多个节点可用,请设置exec.node或tools.exec.node来选择一个。exec host=node是节点唯一的 shell 执行路径;旧的nodes.run包装器已被移除。- 在非 Windows 主机上,exec 会在设置了
SHELL时使用它;如果SHELL是fish,则会优先使用PATH中的bash(或sh),以避免 fish 不兼容的 bash 语法,然后如果两者都不存在才回退到SHELL。 - 在 Windows 主机上,exec 优先发现 PowerShell 7(
pwsh)(Program Files、ProgramW6432,然后是 PATH),然后回退到 Windows PowerShell 5.1。 - 在非 Windows 的 gateway 主机上,bash 和 zsh exec 命令使用启动快照。OpenClaw 会从 shell 启动文件中捕获可 source 的别名/函数以及一小组安全环境变量,保存到
$OPENCLAW_STATE_DIR/cache/shell-snapshots/,然后在每次 exec 命令前先 source 该快照。看起来像密钥的变量会被排除;sandbox 和 node exec 不使用此快照。将 Gateway 进程环境中的OPENCLAW_EXEC_SHELL_SNAPSHOT=0设为禁用此快照路径。 - 主机执行(
gateway/node)会拒绝env.PATH和加载器覆盖(LD_*/DYLD_*),以防止二进制劫持或注入代码。 - OpenClaw 会在生成的命令环境中设置
OPENCLAW_SHELL=exec(包括 PTY 和 sandbox 执行),以便 shell/profile 规则能够检测 exec-tool 上下文。 - 对于 channel-origin 运行,如果 channel 提供了这些 id,OpenClaw 还会在
OPENCLAW_CHANNEL_CONTEXT中公开一个窄范围的发送者/聊天身份 JSON 负载。 exec不能运行openclaw channels login或/approveshell 命令:openclaw channels login是一个交互式 channel 认证流程,而/approve需要走批准命令处理器,而不是 shell。请在 gateway 主机上的终端中运行 channel 登录,或者在存在相应工具时使用特定于 channel 的登录代理工具(例如whatsapp_login)。- 重要:默认情况下,sandboxing 是关闭的。如果 sandboxing 关闭,隐式的
host=auto会解析为gateway。显式的host=sandbox仍然会关闭失败,而不会静默地在 gateway 主机上运行。请启用 sandboxing,或使用带批准的host=gateway。 - 脚本预检检查(针对常见的 Python/Node shell 语法错误)只会检查有效
workdir边界内的文件。如果脚本路径解析到workdir之外,则会跳过该文件的预检。当host=gateway且有效策略为security=full并且ask=off时,预检也会完全跳过。 - 对于现在开始的长时间运行工作,只启动一次,并依赖在启用自动完成唤醒且命令输出或失败时的自动完成唤醒。使用
process获取日志、状态、输入或干预;不要用 sleep 循环、超时循环或重复轮询来模拟调度。 - agent 启动的后台命令会显示在 Web、iOS 和 Android 的后台任务视图中,直到它们完成。任务账本会在完成心跳再次唤醒 agent 之前完成最终定稿。
- 对于应在稍后或按计划执行的工作,请使用 cron,而不是
exec的 sleep/delay 模式。
配置
对于 gateway 和 node,默认使用无需审批的 host exec(
mode=full)——这来自 host-policy 默认值,而不是 host=auto。如果你想要审批/allowlist 行为,请设置 tools.exec.mode 并收紧 host approvals 文件;见Exec approvals。如果想无论沙盒状态如何都强制使用 gateway 或 node 路由,请设置 tools.exec.host 或使用 /exec host=...。
示例:
模式
tools.exec.mode 是规范化持久化的策略开关。运行时安全性和审批行为都由它派生。
每个会话的
/exec ask=always 仍然会每次都询问人工,无论持久化模式为何。
自动审查审批是一次性的。在 gateway 上,OpenClaw 会向审查者提供已解析的可执行文件路径,并将执行锁定到同一路径。那些无法归约为单一可执行执行计划的命令——例如 heredoc、shell 展开,或不受支持的包装器引用方式——即使模型本可放行,也会回退到人工审批。
对于并非已由显式运行时或原生策略决定的 Codex app-server 命令审批,会走人工审批路径。OpenClaw 不会为这些请求运行其配置的 exec 审查器,因为 Codex 不会暴露一个可执行且可强制绑定的已解析可执行文件,使审查决定与 Codex 实际运行的命令绑定起来。
内联求值(strictInlineEval)
当 tools.exec.strictInlineEval 为 true 时,内联解释器求值形式需要审查者或显式审批:python -c、node -e、ruby -e、perl -e、php -r、lua -e,以及其他受支持解释器和命令载体中的类似形式(如 awk、find -exec、make、sed、xargs 等更多形式)。在 mode=auto 下,常规 exec 审批路径可能会让原生自动审查者放行一个明显低风险的一次性命令;但直接的 node-host system.run 调用仍需要显式审批,因为它们无法把命令交给人工审批路线。如果审查者提出要求,请求会转给人工。allow-always 仍然可以为良性的解释器/脚本调用持久化规则,但内联 eval 形式不会变成持久化的允许规则。
PATH 处理
host=gateway:将你的登录 shellPATH合并到 exec 环境中。env.PATH覆盖会被拒绝用于 host 执行。daemon 本身仍使用最小PATH运行:- macOS:
/opt/homebrew/bin、/usr/local/bin、/usr/bin、/bin - Linux:
/usr/local/bin、/usr/bin、/bin - 为防止用户 shell 配置(如
~/.zshenv或/etc/zshenv)在启动期间覆盖优先路径,tools.exec.pathPrepend条目会在执行前,安全地预先追加到 shell 命令内最终的PATH前面。
- macOS:
host=sandbox:在容器内运行sh -lc(登录 shell),因此/etc/profile可能会重置PATH。OpenClaw 会在 profile 加载后,通过内部环境变量(不做 shell 插值)把env.PATH预先追加进去;tools.exec.pathPrepend在这里同样生效。host=node:只会发送你传入的、未被阻止的 env 覆盖项。env.PATH覆盖会被拒绝用于 host 执行,并被 node hosts 忽略。如果你需要在 node 上增加 PATH 条目,请配置 node host service 环境(systemd/launchd)或将工具安装到标准位置。
会话覆盖(/exec)
使用 /exec 为每个会话设置 host、security、ask 和 node 的默认值。不带参数发送 /exec 将显示当前值。
示例:
/exec 仅对通过通道允许列表/配对和访问组的已授权发送者生效。访问组强制始终启用。它只更新会话状态,不会写入配置。已授权的外部通道发送者可以设置这些会话默认值。内部 gateway/webchat 客户端需要 operator.admin 才能持久化它们。
要完全禁用 exec,请通过工具策略拒绝它(tools.deny: ["exec"] 或按代理设置)。除非你显式设置 security=full 且 ask=off,否则仍然适用 host 审批。
Exec 批准(伴侣应用/node 主机)
沙盒化代理在网关或 node 主机上运行exec 之前,可能需要按请求进行批准。有关策略、允许列表和 UI 流程,请参见 Exec 批准。
当需要人工批准时,node 主机和非原生网关流程会立即返回 status: "approval-pending" 以及一个批准 ID。原生聊天和 Web UI 网关流程则可以改为在行内等待,并在批准后返回最终的命令结果。approval-pending 结果表示命令尚未开始,因此只有当已批准的命令实际以内联方式运行时,前台回退警告才会出现。已批准的异步运行会发出命令进度和完成系统事件(Exec running/Exec finished);被拒绝或超时的批准是终态,不会用拒绝系统事件唤醒代理会话。
在具有原生批准卡片/按钮的渠道中,代理应首先依赖该原生 UI,只有在工具结果明确说明聊天批准不可用,或手动批准是唯一途径时,才应包含手动 /approve 命令。
允许列表 + 安全 bin
手动允许列表强制会匹配已解析的二进制路径 glob 和裸命令名 glob。裸名称只匹配通过 PATH 调用的命令,因此当命令是rg 时,rg 可以匹配 /opt/homebrew/bin/rg,但不能匹配 ./rg 或 /tmp/rg。
当 security=allowlist 时,只有在流水线中的每个分段都在允许列表中或属于安全 bin 时,shell 命令才会被自动允许。除非每个顶层分段都满足允许列表(包括安全 bin),否则链式操作(;、&&、||)和重定向会在允许列表模式下被拒绝。重定向仍然不受支持。持久化的 allow-always 信任不会绕过该规则:链式命令仍然要求每个顶层分段都匹配。
autoAllowSkills 是 exec 审批中的一个单独便捷路径,不同于手动路径允许列表条目。若要严格地显式信任,请保持 autoAllowSkills 处于禁用状态。
将这两个控制项用于不同用途:
tools.exec.safeBins:小型、仅 stdin 的流过滤器。tools.exec.safeBinTrustedDirs:为安全 bin 可执行路径显式添加额外受信任目录。tools.exec.safeBinProfiles:为自定义安全 bin 显式指定 argv 策略。- 允许列表:对可执行路径的显式信任。
safeBins 视为通用允许列表,也不要添加解释器/运行时二进制文件(例如 python3、node、ruby、bash)。如果你需要这些,请使用显式允许列表条目并保持审批提示启用。
openclaw security audit 会在解释器/运行时的 safeBins 条目缺少显式配置文件时发出警告,而 openclaw doctor --fix 可以为缺失的自定义 safeBinProfiles 条目生成脚手架。openclaw security audit 和 openclaw doctor 也会在你显式将 jq 这类具有广泛行为的 bin 重新添加到 safeBins 时发出警告(jq 可以读取环境数据,并从模块或启动文件加载 jq 代码,因此应优先使用显式允许列表条目或受审批门控的运行方式)。即使显式列出,jq 也会被拒绝为安全 bin。如果你显式允许列表化了解释器,请启用 tools.exec.strictInlineEval,这样内联代码求值形式仍然需要审核者或显式批准。
有关完整的策略细节和示例,请参见 Exec approvals 和 Safe bins versus allowlist。
示例
前台:apply_patch
apply_patch 是 exec 的一个子工具,用于结构化的多文件编辑。它默认启用,并且对任何模型提供方都可用;allowModels 可以对其进行限制。只有在你想要禁用它或将其限制给特定模型时,才使用配置:
- 工具策略仍然适用;
allow: ["write"]会隐式允许apply_patch。 deny: ["write"]不会拒绝apply_patch;如果也要阻止补丁写入,请显式拒绝apply_patch,或者在应同时阻止补丁写入时使用deny: ["group:fs"]。- 配置位于
tools.exec.applyPatch下。 tools.exec.applyPatch.enabled的默认值是true;将其设为false可禁用该工具。tools.exec.applyPatch.workspaceOnly的默认值是true(仅限工作区内)。只有在你有意让apply_patch在工作区目录之外进行写入/删除时,才将其设为false。tools.exec.applyPatch.allowModels是一个可选的模型 id 白名单(原始格式,如gpt-5.4,或完整格式,如openai/gpt-5.4)。设置后,只有匹配的模型才能使用该工具;未设置时,所有模型都可使用。