Exec Tool
Führe Shell-Befehle in der Workspace aus. Unterstützt Vordergrund- und Hintergrundausführung über process.
Wenn process nicht erlaubt ist, läuft exec synchron und ignoriert yieldMs/background.
Hintergrund-Sessions sind pro Agent isoliert; process sieht nur Sessions vom selben Agent.
Parameter
command(erforderlich)workdir(Standard: aktuelles Verzeichnis)env(Key/Value-Überschreibungen)yieldMs(Standard: 10000): automatisch in den Hintergrund nach Verzögerungbackground(bool): sofort in den Hintergrundtimeout(Sekunden, Standard: 1800): Prozess beenden bei Ablaufpty(bool): in einem Pseudo-Terminal ausführen, wenn verfügbar (für TTY-only CLIs, Coding-Agents, Terminal-UIs)host(sandbox | gateway | node): wo der Befehl ausgeführt wirdsecurity(deny | allowlist | full): Sicherheitsmodus fürgateway/nodeask(off | on-miss | always): Freigabe-Prompts fürgateway/nodenode(string): Node-ID/Name fürhost=nodeelevated(bool): erhöhte Rechte anfordern (Gateway-Host);security=fullwird nur erzwungen, wenn elevated zufullaufgelöst wird
Hinweise:
hostist standardmäßigsandbox.elevatedwird ignoriert, wenn Sandboxing deaktiviert ist (exec läuft dann bereits auf dem Host).gateway/node-Freigaben werden über~/.openclaw/exec-approvals.jsongesteuert.nodebenötigt einen gepaarten Node (Companion-App oder Headless-Node-Host).- Bei mehreren verfügbaren Nodes setze
exec.nodeodertools.exec.node, um einen auszuwählen. - Auf Nicht-Windows-Hosts nutzt exec
SHELL, wenn gesetzt; beiSHELL=fishbevorzugt esbash(odersh) ausPATH, um fish-inkompatible Skripte zu vermeiden, und fällt aufSHELLzurück, wenn keines existiert. - Host-Ausführung (
gateway/node) lehntenv.PATHund Loader-Überschreibungen (LD_*/DYLD_*) ab, um Binary-Hijacking oder injizierten Code zu verhindern. - Wichtig: Sandboxing ist standardmäßig deaktiviert. Wenn Sandboxing aus ist, läuft
host=sandboxdirekt auf dem Gateway-Host (kein Container) und benötigt keine Freigaben. Um Freigaben zu erzwingen, nutzehost=gatewayund konfiguriere Exec-Freigaben (oder aktiviere Sandboxing).
Config
tools.exec.notifyOnExit(Standard: true): wenn true, reihen Hintergrund-Exec-Sessions ein System-Event ein und fordern einen Heartbeat beim Beenden an.tools.exec.approvalRunningNoticeMs(Standard: 10000): gibt eine einzelne “running”-Benachrichtigung aus, wenn ein freigabepflichtiger Exec länger als diese Zeit läuft (0 deaktiviert).tools.exec.host(Standard:sandbox)tools.exec.security(Standard:denyfür Sandbox,allowlistfür Gateway + Node, wenn nicht gesetzt)tools.exec.ask(Standard:on-miss)tools.exec.node(Standard: nicht gesetzt)tools.exec.pathPrepend: Liste von Verzeichnissen, die demPATHfür Exec-Läufe vorangestellt werden.tools.exec.safeBins: stdin-only sichere Binaries, die ohne explizite Allowlist-Einträge laufen können.
Beispiel:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
PATH-Handling
host=gateway: merged deinen Login-Shell-PATHin die Exec-Umgebung.env.PATH-Überschreibungen werden für Host-Ausführung abgelehnt. Der Daemon selbst läuft mit minimalemPATH:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: führtsh -lc(Login-Shell) im Container aus, sodass/etc/profiledenPATHzurücksetzen kann. OpenClaw stelltenv.PATHnach dem Profile-Sourcing über eine interne Umgebungsvariable voran (keine Shell-Interpolation);tools.exec.pathPrependgilt hier ebenfalls.host=node: nur nicht-blockierte Env-Überschreibungen, die du übergibst, werden an den Node gesendet.env.PATH-Überschreibungen werden für Host-Ausführung abgelehnt. Headless-Node-Hosts akzeptierenPATHnur, wenn es dem Node-Host- PATH vorangestellt wird (kein Ersetzen). macOS-Nodes verwerfenPATH-Überschreibungen komplett.
Per-Agent-Node-Binding (nutze den Agent-List-Index in der Config):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Control-UI: der Nodes-Tab enthält ein kleines “Exec node binding”-Panel für dieselben Einstellungen.
Session-Overrides (/exec)
Nutze /exec, um pro Session Standardwerte für host, security, ask und node zu setzen.
Sende /exec ohne Argumente, um die aktuellen Werte anzuzeigen.
Beispiel:
/exec host=gateway security=allowlist ask=on-miss node=mac-1
Authorization-Model
/exec wird nur für autorisierte Absender berücksichtigt (Channel-Allowlists/Pairing plus commands.useAccessGroups).
Es aktualisiert nur den Session-State und schreibt keine Config. Um exec komplett zu deaktivieren, verbiete es über Tool-
Policy (tools.deny: ["exec"] oder per Agent). Host-Freigaben gelten weiterhin, außer du setzt explizit
security=full und ask=off.
Exec-Freigaben (Companion-App / Node-Host)
Sandboxed Agents können eine Freigabe pro Request verlangen, bevor exec auf dem Gateway oder Node-Host läuft.
Siehe Exec-Freigaben für Policy, Allowlist und UI-Flow.
Wenn Freigaben erforderlich sind, gibt das Exec-Tool sofort
status: "approval-pending" und eine Approval-ID zurück. Nach Freigabe (oder Ablehnung / Timeout)
sendet das Gateway System-Events (Exec finished / Exec denied). Wenn der Befehl nach
tools.exec.approvalRunningNoticeMs noch läuft, wird eine einzelne Exec running-Benachrichtigung ausgegeben.
Allowlist + Safe Bins
Allowlist-Enforcement matcht nur aufgelöste Binary-Pfade (keine Basename-Matches). Bei
security=allowlist werden Shell-Befehle nur automatisch erlaubt, wenn jedes Pipeline-Segment
auf der Allowlist steht oder ein Safe Bin ist. Chaining (;, &&, ||) und Redirections werden im
Allowlist-Modus abgelehnt.
Beispiele
Vordergrund:
{ "tool": "exec", "command": "ls -la" }
Hintergrund + Poll:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
Keys senden (tmux-style):
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Enter"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["C-c"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Up","Up","Enter"]}
Submit (nur CR senden):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
Paste (standardmäßig geklammert):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
apply_patch (experimentell)
apply_patch ist ein Subtool von exec für strukturierte Multi-File-Edits.
Aktiviere es explizit:
{
tools: {
exec: {
applyPatch: { enabled: true, allowModels: ["gpt-5.2"] },
},
},
}
Hinweise:
- Nur verfügbar für OpenAI/OpenAI-Codex-Modelle.
- Tool-Policy gilt weiterhin;
allow: ["exec"]erlaubt implizitapply_patch. - Config liegt unter
tools.exec.applyPatch.