Инструмент Exec
Запускайте shell-команды в рабочем пространстве. Поддерживает выполнение на переднем плане + в фоне через 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/node
- ask (off | on-miss | always): запросы на одобрение для gateway/node
- node (строка): id/имя узла для host=node
- elevated (bool): запросить повышенный режим (хост шлюза); security=full принудительно только когда elevated разрешается в full
Примечания:
- host по умолчанию sandbox.
- elevated игнорируется, когда изоляция отключена (exec уже работает на хосте).
- Одобрения gateway/node контролируются ~/.openclaw/exec-approvals.json.
- node требует сопряжённого узла (сопутствующее приложение или безголовый хост узла).
- Если доступно несколько узлов, установите exec.node или tools.exec.node для выбора одного.
- На хостах не Windows exec использует SHELL, если установлен; если SHELL это fish, он предпочитает bash (или sh) из PATH для избежания несовместимых с fish скриптов, затем возвращается к SHELL, если ни один не существует.
- Важно: изоляция отключена по умолчанию. Если изоляция отключена, host=sandbox запускается непосредственно на хосте шлюза (без контейнера) и не требует одобрений. Для требования одобрений запускайте с host=gateway и настройте одобрения exec (или включите изоляцию).
Конфигурация
- tools.exec.notifyOnExit (по умолчанию: true): когда true, фоновые сессии exec ставят в очередь системное событие и запрашивают heartbeat при выходе.
- tools.exec.approvalRunningNoticeMs (по умолчанию: 10000): выдать одно уведомление "запущено", когда exec с одобрением выполняется дольше этого (0 отключает).
- tools.exec.host (по умолчанию: sandbox)
- tools.exec.security (по умолчанию: deny для sandbox, allowlist для gateway + node, когда не установлено)
- tools.exec.ask (по умолчанию: on-miss)
- tools.exec.node (по умолчанию: не установлено)
- tools.exec.pathPrepend: список каталогов для добавления в начало PATH для запусков exec.
- tools.exec.safeBins: безопасные двоичные файлы только для stdin, которые могут запускаться без явных записей в белом списке.
Пример:
\{
tools: \{
exec: \{
pathPrepend: ["~/bin", "/opt/oss/bin"]
\}
\}
\}
Обработка PATH
- host=gateway: объединяет ваш PATH логин-оболочки в окружение exec (если вызов 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 (логин-оболочку) внутри контейнера, поэтому /etc/profile может сбросить PATH. OpenClaw добавляет env.PATH в начало после загрузки профиля через внутреннюю переменную окружения (без интерполяции оболочки); tools.exec.pathPrepend также применяется здесь.
- host=node: только переопределения env, которые вы передаёте, отправляются на узел. tools.exec.pathPrepend применяется только если вызов exec уже устанавливает env.PATH. Безголовые хосты узлов принимают PATH только когда он добавляется в начало PATH хоста узла (без замены). Узлы macOS полностью отбрасывают переопределения PATH.
Привязка узла для каждого агента (используйте индекс списка агентов в конфигурации):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Control UI: вкладка Узлы включает небольшую панель "Привязка узла exec" для тех же настроек.
Переопределения сессии (/exec)
Используйте /exec для установки значений по умолчанию для сессии для host, security, ask и node. Отправьте /exec без аргументов для отображения текущих значений.
Пример:
/exec host=gateway security=allowlist ask=on-miss node=mac-1
Модель авторизации
/exec учитывается только для авторизованных отправителей (белые списки каналов/сопряжение плюс commands.useAccessGroups). Он обновляет только состояние сессии и не пишет конфигурацию. Для жёсткого отключения exec запретите его через политику инструментов (tools.deny: ["exec"] или для каждого агента). Одобрения хоста всё ещё применяются, если вы явно не установите security=full и ask=off.
Одобрения Exec (сопутствующее приложение / хост узла)
Изолированные агенты могут требовать одобрения для каждого запроса перед тем, как exec запустится на шлюзе или хосте узла. См. Одобрения Exec для политики, белого списка и потока UI.
Когда требуются одобрения, инструмент exec немедленно возвращает status: "approval-pending" и id одобрения. После одобрения (или отказа / тайм-аута), Gateway выдаёт системные события (Exec finished / Exec denied). Если команда всё ещё выполняется после tools.exec.approvalRunningNoticeMs, выдаётся одно уведомление Exec running.
Белый список + безопасные двоичные файлы
Применение белого списка соответствует только разрешённым путям двоичных файлов (без соответствия basename). Когда security=allowlist, shell-команды автоматически разрешаются только если каждый сегмент конвейера находится в белом списке или является безопасным двоичным файлом. Цепочки (;, &&, ||) и перенаправления отклоняются в режиме белого списка.
Примеры
Передний план:
{"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.