Инструмент Exec¶
Запуск команд оболочки в рабочем пространстве. Поддерживает выполнение на переднем и фоновом плане через process.
Если process запрещён, exec выполняется синхронно и игнорирует yieldMs/background.
Фоновые сеансы ограничены агентом; process видит только сеансы того же агента.
Параметры¶
command(обязательно)workdir(по умолчанию cwd)env(переопределения ключ/значение)yieldMs(по умолчанию 10000): автоматический перевод в фон после задержкиbackground(bool): сразу в фонtimeout(секунды, по умолчанию 1800): завершить по истечении срокаpty(bool): запуск в псевдотерминале при наличии (CLI, работающие только с TTY, кодинговые агенты, терминальные UI)host(sandbox | gateway | node): где выполнятьsecurity(deny | allowlist | full): режим принудительного применения дляgateway/nodeask(off | on-miss | always): запросы подтверждения дляgateway/nodenode(string): id/имя узла дляhost=nodeelevated(bool): запрос повышенного режима (хост шлюза Gateway);security=fullпринудительно применяется только когда повышенный режим разрешается вfull
Примечания:
hostпо умолчанию равенsandbox.elevatedигнорируется, когда sandboxing выключен (exec уже выполняется на хосте).- Подтверждения
gateway/nodeконтролируются~/.openclaw/exec-approvals.json. nodeтребует сопряжённый узел (сопутствующее приложение или headless хост узла).- Если доступно несколько узлов, задайте
exec.nodeилиtools.exec.nodeдля выбора одного. - На хостах, отличных от Windows, exec использует
SHELLпри наличии; еслиSHELLравноfish, он предпочитаетbash(илиsh) изPATH, чтобы избежать скриптов, несовместимых с fish, затем откатывается кSHELL, если ни один не существует. - Выполнение на хосте (
gateway/node) отклоняетenv.PATHи переопределения загрузчика (LD_*/DYLD_*) для предотвращения подмены бинарников или внедрённого кода. - Важно: sandboxing по умолчанию выключен. Если sandboxing выключен,
host=sandboxвыполняется напрямую на хосте шлюза Gateway (без контейнера) и не требует подтверждений. Чтобы требовать подтверждения, запускайте сhost=gatewayи настройте подтверждения exec (или включите sandboxing).
Конфигурация¶
tools.exec.notifyOnExit(по умолчанию: true): если true, фоновые сеансы exec ставят системное событие в очередь и запрашивают сигнал keepalive при завершении.tools.exec.approvalRunningNoticeMs(по умолчанию: 10000): выдаёт одно уведомление «выполняется», если exec с подтверждением выполняется дольше этого времени (0 — отключает).tools.exec.host(по умолчанию:sandbox)tools.exec.security(по умолчанию:denyдля sandbox,allowlistдля Gateway (шлюз) + узла, если не задано)tools.exec.ask(по умолчанию:on-miss)tools.exec.node(по умолчанию: unset)tools.exec.pathPrepend: список каталогов для добавления в началоPATHпри запусках exec.tools.exec.safeBins: безопасные бинарники «только stdin», которые могут выполняться без явных записей allowlist.
Пример:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
Обработка PATH¶
host=gateway: объединяетPATHвашей login-оболочки в окружение exec. Переопределенияenv.PATHотклоняются для выполнения на хосте. Сам демон по‑прежнему работает с минимальнымPATH:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin host=sandbox: запускаетsh -lc(login-оболочку) внутри контейнера, поэтому/etc/profileможет сброситьPATH. OpenClaw добавляетenv.PATHпосле обработки профиля через внутреннюю переменную окружения (без интерполяции оболочки); здесь также применяетсяtools.exec.pathPrepend.host=node: на узел отправляются только непредотвращённые переопределения окружения, которые вы передаёте. Переопределенияenv.PATHотклоняются для выполнения на хосте. Headless хосты узлов принимаютPATHтолько когда он добавляет префикс к PATH хоста узла (без замены). Узлы macOS полностью отбрасывают переопределенияPATH.
Привязка узла к агенту (используйте индекс агента из конфига):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
UI управления: вкладка Nodes включает небольшую панель «Exec node binding» с теми же настройками.
Переопределения сеанса (/exec)¶
Используйте /exec для задания на уровне сеанса значений по умолчанию для host, security, ask и node.
Отправьте /exec без аргументов, чтобы показать текущие значения.
Пример:
/exec host=gateway security=allowlist ask=on-miss node=mac-1
Модель авторизации¶
/exec учитывается только для авторизованных отправителей (allowlist каналов/сопряжение плюс commands.useAccessGroups).
Он обновляет только состояние сеанса и не записывает конфиг. Чтобы жёстко отключить exec, запретите его через
политику инструментов (tools.deny: ["exec"] или для конкретного агента). Подтверждения на хосте всё равно применяются, если вы явно не зададите
security=full и ask=off.
Подтверждения Exec (сопутствующее приложение / хост узла)¶
Агенты в sandbox могут требовать подтверждение для каждого запроса перед тем, как exec будет выполнен на хосте шлюза Gateway или хосте узла.
См. Подтверждения Exec — политика, allowlist и поток UI.
Когда подтверждения требуются, инструмент exec немедленно возвращает
status: "approval-pending" и id подтверждения. После подтверждения (или отказа / тайм-аута)
Gateway (шлюз) отправляет системные события (Exec finished / Exec denied). Если команда всё ещё
выполняется после tools.exec.approvalRunningNoticeMs, отправляется одно уведомление Exec running.
Allowlist + безопасные бинарники¶
Принудительное применение allowlist сопоставляет только разрешённые пути бинарников (без сопоставления по имени файла). Когда
security=allowlist, команды оболочки автоматически разрешаются только если каждый сегмент конвейера
разрешён allowlist или является безопасным бинарником. Цепочки (;, &&, ||) и перенаправления отклоняются в
режиме allowlist.
Примеры¶
На переднем плане:
{ "tool": "exec", "command": "ls -la" }
Фон + опрос:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
Отправка клавиш (в стиле tmux):
{"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"]}
Отправить (только CR):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
Вставка (по умолчанию с обрамлением):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
apply_patch (экспериментально)¶
apply_patch — это подинструмент exec для структурированных правок в нескольких файлах.
Включите его явно:
{
tools: {
exec: {
applyPatch: { enabled: true, allowModels: ["gpt-5.2"] },
},
},
}
Примечания:
- Доступно только для моделей OpenAI/OpenAI Codex.
- Политика инструментов по‑прежнему применяется;
allow: ["exec"]неявно разрешаетapply_patch. - Конфигурация находится в
tools.exec.applyPatch.