Exec tool
Run shell commands in the workspace. Supports foreground + background execution viaprocess.
If process is disallowed, exec runs synchronously and ignores yieldMs/background.
Background sessions are scoped per agent; process only sees sessions from the same agent.
Parameters
command(required)workdir(defaults to cwd)env(key/value overrides)yieldMs(default 10000): auto-background after delaybackground(bool): background immediatelytimeout(seconds, default 1800): kill on expirypty(bool): run in a pseudo-terminal when available (TTY-only CLIs, coding agents, terminal UIs)host(sandbox | gateway | node): where to executesecurity(deny | allowlist | full): enforcement mode forgateway/nodeask(off | on-miss | always): approval prompts forgateway/nodenode(string): node id/name forhost=nodeelevated(bool): request elevated mode (gateway host);security=fullis only forced when elevated resolves tofull
hostdefaults tosandbox.elevatedis ignored when sandboxing is off (exec already runs on the host).gateway/nodeapprovals are controlled by~/.openclaw/exec-approvals.json.noderequires a paired node (companion app or headless node host).- If multiple nodes are available, set
exec.nodeortools.exec.nodeto select one. - On non-Windows hosts, exec uses
SHELLwhen set; ifSHELLisfish, it prefersbash(orsh) fromPATHto avoid fish-incompatible scripts, then falls back toSHELLif neither exists. - On Windows hosts, exec prefers PowerShell 7 (
pwsh) discovery (Program Files, ProgramW6432, then PATH), then falls back to Windows PowerShell 5.1. - Host execution (
gateway/node) rejectsenv.PATHand loader overrides (LD_*/DYLD_*) to prevent binary hijacking or injected code. - Important: sandboxing is off by default. If sandboxing is off and
host=sandboxis explicitly configured/requested, exec now fails closed instead of silently running on the gateway host. Enable sandboxing or usehost=gatewaywith approvals. - Script preflight checks (for common Python/Node shell-syntax mistakes) only inspect files inside the
effective
workdirboundary. If a script path resolves outsideworkdir, preflight is skipped for that file.
Config
tools.exec.notifyOnExit(default: true): when true, backgrounded exec sessions enqueue a system event and request a heartbeat on exit.tools.exec.approvalRunningNoticeMs(default: 10000): emit a single โrunningโ notice when an approval-gated exec runs longer than this (0 disables).tools.exec.host(default:sandbox)tools.exec.security(default:denyfor sandbox,allowlistfor gateway + node when unset)tools.exec.ask(default:on-miss)tools.exec.node(default: unset)tools.exec.pathPrepend: list of directories to prepend toPATHfor exec runs (gateway + sandbox only).tools.exec.safeBins: stdin-only safe binaries that can run without explicit allowlist entries. For behavior details, see Safe bins.tools.exec.safeBinTrustedDirs: additional explicit directories trusted forsafeBinspath checks.PATHentries are never auto-trusted. Built-in defaults are/binand/usr/bin.tools.exec.safeBinProfiles: optional custom argv policy per safe bin (minPositional,maxPositional,allowedValueFlags,deniedFlags).
PATH handling
host=gateway: merges your login-shellPATHinto the exec environment.env.PATHoverrides are rejected for host execution. The daemon itself still runs with a minimalPATH:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: runssh -lc(login shell) inside the container, so/etc/profilemay resetPATH. OpenClaw prependsenv.PATHafter profile sourcing via an internal env var (no shell interpolation);tools.exec.pathPrependapplies here too.host=node: only non-blocked env overrides you pass are sent to the node.env.PATHoverrides are rejected for host execution and ignored by node hosts. If you need additional PATH entries on a node, configure the node host service environment (systemd/launchd) or install tools in standard locations.
Session overrides (/exec)
Use /exec to set per-session defaults for host, security, ask, and node.
Send /exec with no arguments to show the current values.
Example:
Authorization model
/exec is only honored for authorized senders (channel allowlists/pairing plus commands.useAccessGroups).
It updates session state only and does not write config. To hard-disable exec, deny it via tool
policy (tools.deny: ["exec"] or per-agent). Host approvals still apply unless you explicitly set
security=full and ask=off.
Exec approvals (companion app / node host)
Sandboxed agents can require per-request approval beforeexec runs on the gateway or node host.
See Exec approvals for the policy, allowlist, and UI flow.
When approvals are required, the exec tool returns immediately with
status: "approval-pending" and an approval id. Once approved (or denied / timed out),
the Gateway emits system events (Exec finished / Exec denied). If the command is still
running after tools.exec.approvalRunningNoticeMs, a single Exec running notice is emitted.
Allowlist + safe bins
Manual allowlist enforcement matches resolved binary paths only (no basename matches). Whensecurity=allowlist, shell commands are auto-allowed only if every pipeline segment is
allowlisted or a safe bin. Chaining (;, &&, ||) and redirections are rejected in
allowlist mode unless every top-level segment satisfies the allowlist (including safe bins).
Redirections remain unsupported.
autoAllowSkills is a separate convenience path in exec approvals. It is not the same as
manual path allowlist entries. For strict explicit trust, keep autoAllowSkills disabled.
Use the two controls for different jobs:
tools.exec.safeBins: small, stdin-only stream filters.tools.exec.safeBinTrustedDirs: explicit extra trusted directories for safe-bin executable paths.tools.exec.safeBinProfiles: explicit argv policy for custom safe bins.- allowlist: explicit trust for executable paths.
safeBins as a generic allowlist, and do not add interpreter/runtime binaries (for example python3, node, ruby, bash). If you need those, use explicit allowlist entries and keep approval prompts enabled.
openclaw security audit warns when interpreter/runtime safeBins entries are missing explicit profiles, and openclaw doctor --fix can scaffold missing custom safeBinProfiles entries.
For full policy details and examples, see Exec approvals and Safe bins versus allowlist.
Examples
Foreground:apply_patch (experimental)
apply_patch is a subtool of exec for structured multi-file edits.
Enable it explicitly:
- Only available for OpenAI/OpenAI Codex models.
- Tool policy still applies;
allow: ["exec"]implicitly allowsapply_patch. - Config lives under
tools.exec.applyPatch. tools.exec.applyPatch.workspaceOnlydefaults totrue(workspace-contained). Set it tofalseonly if you intentionally wantapply_patchto write/delete outside the workspace directory.