exec は変更を伴うシェルサーフェスです。選択されたホストまたはサンドボックスのファイルシステムが許可する場所で、コマンドはファイルを作成、編集、削除できます。write、edit、apply_patch などの OpenClaw ファイルシステムツールを無効にしても、exec が読み取り専用になるわけではありません。
process によるフォアグラウンド実行とバックグラウンド実行をサポートします。process が許可されていない場合、exec は同期的に実行され、yieldMs/background を無視します。バックグラウンドセッションはエージェントごとにスコープされます。process は同じエージェントのセッションのみを参照します。
パラメータ
実行するシェルコマンド。
コマンドの作業ディレクトリ。
継承された環境の上にマージされるキー/値の環境オーバーライド。
この遅延(ms)の後にコマンドを自動的にバックグラウンド化します。
yieldMs を待たずに、コマンドをただちにバックグラウンド化します。この呼び出しの設定済み exec タイムアウトを秒単位で上書きします。フォアグラウンド、バックグラウンド、
yieldMs、gateway、サンドボックス、node system.run 実行に適用されます。timeout: 0 は、その呼び出しの exec プロセスタイムアウトを無効にします。利用可能な場合は疑似ターミナルで実行します。TTY 専用 CLI、コーディングエージェント、ターミナル UI に使用します。
実行場所。
auto は、サンドボックスランタイムがアクティブな場合は sandbox に、それ以外の場合は gateway に解決されます。通常のツール呼び出しでは無視されます。
gateway/node のセキュリティは tools.exec.security とホスト承認ファイルで制御されます。昇格モードは、オペレーターが明示的に昇格アクセスを許可した場合にのみ security=full を強制できます。ベースラインの確認モードは
tools.exec.ask とホスト承認から取得されます。チャネル起点のモデル呼び出しでは、有効なホスト確認が off の場合、呼び出しごとの ask は無視されます。それ以外の場合は、より厳格なモードへ強化することだけができます。明示的な ask 値で exec ツールを構築する信頼済みの内部/API 呼び出し元は変更されません。host=node の場合の Node ID/名前。昇格モードをリクエストします。サンドボックスを抜けて設定済みホストパス上で実行します。
security=full は、elevated が full に解決される場合にのみ強制されます。hostはauto、sandbox、gateway、nodeのみを受け付けます。これはホスト名セレクターではありません。ホスト名のような値は、コマンド実行前に拒否されます。- 呼び出しごとの
host=nodeはautoから許可されます。呼び出しごとのhost=gatewayは、サンドボックスランタイムがアクティブでない場合にのみ許可されます。 - 追加設定がなくても、
host=autoはそのまま動作します。サンドボックスがない場合はgatewayに解決され、稼働中のサンドボックスがある場合はサンドボックス内に留まります。 elevatedはサンドボックスを抜けて設定済みホストパス上で実行します。デフォルトではgateway、またはtools.exec.host=nodeの場合(またはセッションデフォルトがhost=nodeの場合)はnodeです。現在のセッション/プロバイダーで昇格アクセスが有効な場合にのみ利用できます。gateway/nodeの承認はホスト承認ファイルで制御されます。nodeにはペアリング済み Node(コンパニオンアプリまたはヘッドレス Node ホスト)が必要です。複数の Node が利用可能な場合は、exec.nodeまたはtools.exec.nodeを設定して 1 つを選択します。exec host=nodeは Node の唯一のシェル実行パスです。従来のnodes.runラッパーは削除されました。- Windows 以外のホストでは、exec は
SHELLが設定されている場合にそれを使用します。SHELLがfishの場合、fish と互換性のない bashism を避けるため、PATHからbash(またはsh)を優先し、どちらも存在しない場合に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 します。シークレットのように見える変数は除外されます。サンドボックスと node exec はこのスナップショットを使用しません。このスナップショットパスを無効にするには、Gateway プロセス環境でOPENCLAW_EXEC_SHELL_SNAPSHOT=0を設定します。 - ホスト実行(
gateway/node)は、バイナリの乗っ取りやコード注入を防ぐため、env.PATHとローダーオーバーライド(LD_*/DYLD_*)を拒否します。 - OpenClaw は、生成されるコマンド環境(PTY とサンドボックス実行を含む)に
OPENCLAW_SHELL=execを設定し、shell/profile ルールが exec ツールのコンテキストを検出できるようにします。 - チャネル起点の実行では、チャネルがそれらの ID を提供した場合、OpenClaw は狭い範囲の送信者/チャット ID JSON ペイロードも
OPENCLAW_CHANNEL_CONTEXTで公開します。 execはopenclaw channels loginまたは/approveシェルコマンドを実行できません。openclaw channels loginは対話型のチャネル認証フローであり、/approveはシェルではなく承認コマンドハンドラーを通る必要があります。チャネルログインは gateway ホスト上のターミナルで実行するか、存在する場合はチャネル固有のログインエージェントツール(例:whatsapp_login)を使用します。- 重要: サンドボックス化はデフォルトでオフです。サンドボックス化がオフの場合、暗黙の
host=autoはgatewayに解決されます。明示的なhost=sandboxは、gateway ホスト上で黙って実行されるのではなく、引き続き fail closed します。サンドボックス化を有効にするか、承認付きでhost=gatewayを使用してください。 - スクリプトの事前チェック(一般的な Python/Node のシェル構文ミス向け)は、有効な
workdir境界内のファイルのみを検査します。スクリプトパスがworkdirの外に解決される場合、そのファイルの事前チェックはスキップされます。また、host=gatewayで有効なポリシーがsecurity=fullかつask=offの場合、事前チェックは完全にスキップされます。 - すぐに開始する長時間実行の作業では、一度だけ開始し、自動完了 wake が有効で、コマンドが出力を発するか失敗した場合はそれに依存します。ログ、ステータス、入力、介入には
processを使用してください。sleep ループ、timeout ループ、繰り返しポーリングでスケジューリングを模倣しないでください。 - 後で実行する必要がある作業、またはスケジュール上で実行する必要がある作業には、
execの sleep/delay パターンではなく cron を使用してください。
設定
| キー | デフォルト | 注記 |
|---|---|---|
tools.exec.timeoutSec | 1800 | コマンドごとのデフォルト exec タイムアウト(秒)。呼び出しごとの timeout がこれを上書きします。呼び出しごとの timeout: 0 は exec プロセスタイムアウトを無効にします。 |
tools.exec.host | auto | サンドボックスランタイムがアクティブな場合は sandbox に、それ以外の場合は gateway に解決されます。 |
tools.exec.security | sandbox では deny、未設定時の gateway/node では full | |
tools.exec.ask | off | |
tools.exec.mode | 未設定 | 正規化されたポリシーノブ。下記のモードを参照してください。tools.exec.security/tools.exec.ask と組み合わせることはできません。 |
tools.exec.node | 未設定 | |
tools.exec.notifyOnExit | true | true の場合、バックグラウンド化された exec セッションは終了時にシステムイベントをキューに入れ、Heartbeat をリクエストします。 |
tools.exec.approvalRunningNoticeMs | 10000 | 承認でゲートされた exec がこれより長く実行された場合に、単一の「実行中」通知を出します(0 で無効)。 |
tools.exec.strictInlineEval | false | インライン eval を参照してください。 |
tools.exec.commandHighlighting | false | true の場合、承認プロンプトはコマンドテキスト内のパーサー由来のコマンド範囲をハイライトできます。グローバルまたはエージェントごとに設定します。承認ポリシーは変更されません。 |
tools.exec.pathPrepend | 未設定 | exec 実行時に PATH の先頭へ追加するディレクトリのリスト(gateway + sandbox のみ)。 |
tools.exec.safeBins | 未設定 | 明示的な allowlist エントリなしで実行できる stdin 専用の安全なバイナリ。安全なバイナリを参照してください。 |
tools.exec.safeBinTrustedDirs | /bin, /usr/bin | safeBins のパスチェックで信頼される追加の明示的ディレクトリ。PATH エントリは自動的には信頼されません。 |
tools.exec.safeBinProfiles | 未設定 | safe bin ごとの任意のカスタム argv ポリシー(minPositional、maxPositional、allowedValueFlags、deniedFlags)。 |
security=full、ask=off)です。これはホストポリシーのデフォルトに由来し、host=auto に由来するものではありません。承認/allowlist の動作が必要な場合は、tools.exec.* とホスト承認ファイルの両方を厳格化してください。Exec 承認を参照してください。サンドボックス状態に関係なく gateway または node ルーティングを強制するには、tools.exec.host を設定するか、/exec host=... を使用します。
例:
モード
tools.exec.mode は正規化されたポリシーノブです。これを設定すると security/ask が導出され、明示的な tools.exec.security/tools.exec.ask と組み合わせることはできません。
| モード | security | ask | 動作 |
|---|---|---|---|
deny | deny | off | Exec は拒否されます。 |
allowlist | allowlist | off | 許可リスト済み/安全な bin コマンドのみが実行され、それ以外は確認されません。 |
ask | allowlist | on-miss | 許可リストに一致するものは直接実行され、それ以外は人間に確認されます。 |
auto | allowlist | on-miss | 許可リスト/安全な bin に一致するものは直接実行され、それ以外は人間に確認する前に OpenClaw のネイティブ自動レビューアを経由します。 |
full | full | off | 承認ゲートはありません。 |
ask/ask=always は、モードに関係なく毎回人間に確認します。
インライン eval (strictInlineEval)
tools.exec.strictInlineEval が true の場合、インラインのインタープリター eval 形式にはレビューアまたは明示的な承認が必要です: python -c、node -e、ruby -e、perl -e、php -r、lua -e、osascript -e、および他のサポート対象インタープリターやコマンドキャリア(awk、find -exec、make、sed、xargs など)にまたがる類似形式。mode=auto では、通常の exec 承認パスにより、ネイティブ自動レビューアが明確に低リスクな単発コマンドを許可できる場合があります。直接の node-host system.run 呼び出しは、コマンドを人間の承認ルートへ渡せないため、引き続き明示的な承認が必要です。レビューアが確認を求めた場合、リクエストは人間へ送られます。allow-always は無害なインタープリター/スクリプト呼び出しを引き続き永続化できますが、インライン eval 形式が永続的な許可ルールになることはありません。
PATH の扱い
host=gateway: ログインシェルのPATHを exec 環境にマージします。env.PATHの上書きはホスト実行では拒否されます。デーモン自体は引き続き最小限のPATHで実行されます:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin - 起動中にユーザーのシェル設定(
~/.zshenvや/etc/zshenvなど)が優先パスを上書きしないように、tools.exec.pathPrependエントリは実行直前、シェルコマンド内の最終的なPATHに安全に先頭追加されます。
- macOS:
host=sandbox: コンテナ内でsh -lc(ログインシェル)を実行するため、/etc/profileがPATHをリセットする場合があります。OpenClaw は内部 env var(シェル補間なし)を介して profile の読み込み後にenv.PATHを先頭追加します。tools.exec.pathPrependもここに適用されます。host=node: 渡した env 上書きのうち、ブロックされていないものだけがノードへ送信されます。env.PATHの上書きはホスト実行では拒否され、node ホストでは無視されます。ノードに追加の PATH エントリが必要な場合は、node ホストサービス環境(systemd/launchd)を設定するか、標準の場所にツールをインストールしてください。
セッション上書き (/exec)
/exec を使用して、host、security、ask、node のセッションごとのデフォルトを設定します。現在の値を表示するには、引数なしで /exec を送信します。
例:
/exec は認可済み送信者(チャンネル許可リスト/ペアリングに加えて commands.useAccessGroups)に対してのみ有効です。これはセッション状態のみを更新し、config には書き込みません。認可済みの外部チャンネル送信者は、これらのセッションデフォルトを設定できます。内部 gateway/webchat クライアントが永続化するには operator.admin が必要です。
exec を完全に無効化するには、ツールポリシーで拒否します(tools.deny: ["exec"] またはエージェントごと)。明示的に security=full と ask=off を設定しない限り、ホスト承認は引き続き適用されます。
Exec 承認(コンパニオンアプリ / node ホスト)
サンドボックス化されたエージェントでは、exec が Gateway または node ホストで実行される前に、リクエストごとの承認が必要になる場合があります。ポリシー、許可リスト、UI フローについては Exec 承認 を参照してください。
承認が必要な場合、exec ツールは status: "approval-pending" と承認 id を返して即座に終了します。承認(または拒否 / タイムアウト)されると、Gateway は承認済みの実行に対してのみ、コマンド進行状況と完了のシステムイベントを発行します(Exec running / Exec finished)。拒否またはタイムアウトした承認は終端状態であり、拒否のシステムイベントでエージェントセッションを起こすことはありません。
ネイティブ承認カード/ボタンがあるチャンネルでは、エージェントはまずそのネイティブ UI に依存し、ツール結果がチャット承認を利用できない、または手動承認が唯一のパスであると明示している場合にのみ、手動の /approve コマンドを含めるべきです。
許可リスト + 安全な bin
手動の許可リスト適用は、解決済みバイナリパスの glob と裸のコマンド名 glob に一致します。裸の名前は PATH 経由で呼び出されたコマンドにのみ一致するため、コマンドがrg の場合は rg が /opt/homebrew/bin/rg に一致できますが、./rg や /tmp/rg には一致しません。
security=allowlist の場合、シェルコマンドは、すべてのパイプラインセグメントが許可リスト済みまたは安全な bin の場合にのみ自動許可されます。チェーン(;、&&、||)とリダイレクトは、すべてのトップレベルセグメントが許可リスト(安全な bin を含む)を満たさない限り、allowlist モードで拒否されます。リダイレクトは引き続き未サポートです。永続的な allow-always 信頼はそのルールをバイパスしません。チェーンされたコマンドでは、引き続きすべてのトップレベルセグメントが一致する必要があります。
autoAllowSkills は exec 承認内の別個の便利パスであり、手動パス許可リストエントリと同じものではありません。厳密で明示的な信頼を求める場合は、autoAllowSkills を無効のままにしてください。
2 つのコントロールは異なる用途に使用します:
tools.exec.safeBins: 小さな stdin 専用ストリームフィルター。tools.exec.safeBinTrustedDirs: 安全な bin 実行可能パス用の明示的な追加信頼済みディレクトリ。tools.exec.safeBinProfiles: カスタムの安全な bin 用の明示的な argv ポリシー。- allowlist: 実行可能パスへの明示的な信頼。
safeBins を汎用の許可リストとして扱わないでください。また、インタープリター/ランタイムのバイナリ(例: python3、node、ruby、bash)を追加しないでください。それらが必要な場合は、明示的な許可リストエントリを使用し、承認プロンプトを有効のままにしてください。
openclaw security audit は、インタープリター/ランタイムの safeBins エントリに明示的なプロファイルがない場合に警告し、openclaw doctor --fix は不足しているカスタム safeBinProfiles エントリをスキャフォールドできます。openclaw security audit と openclaw doctor は、jq のような広範な動作を持つ bin を明示的に safeBins へ戻した場合にも警告します(jq は広範なプログラムとビルトインをサポートするため、代わりに明示的な許可リストエントリまたは承認ゲート付き実行を優先してください)。インタープリターを明示的に許可リスト化する場合は、インライン code-eval 形式に引き続きレビューアまたは明示的な承認が必要になるように、tools.exec.strictInlineEval を有効にしてください。
完全なポリシーの詳細と例については、Exec 承認 と 安全な bin と許可リストの比較 を参照してください。
例
フォアグラウンド:apply_patch
apply_patch は、構造化された複数ファイル編集のための exec のサブツールです。これはデフォルトで有効で、どのモデルプロバイダーでも利用できます。allowModels で制限できます。無効化したい場合、または特定のモデルに制限したい場合にのみ config を使用してください:
- ツールポリシーは引き続き適用されます。
allow: ["write"]は暗黙的にapply_patchを許可します。 deny: ["write"]はapply_patchを拒否しません。apply_patchを明示的に拒否するか、パッチ書き込みもブロックする必要がある場合はdeny: ["group:fs"]を使用してください。- Config は
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のような raw、またはopenai/gpt-5.4のような full)。設定されている場合、一致するモデルだけがツールを取得します。未設定の場合、すべてのモデルが取得します。
関連
- Exec 承認 — シェルコマンドの承認ゲート
- サンドボックス化 — サンドボックス化された環境でコマンドを実行する
- バックグラウンドプロセス — 長時間実行される exec と process ツール
- セキュリティ — ツールポリシーと昇格アクセス