Tools
Ferramenta Exec
Execute comandos shell no workspace. exec é uma superfície shell mutável: comandos podem criar, editar ou excluir arquivos onde quer que o host selecionado ou o sistema de arquivos do sandbox permita. Desabilitar ferramentas de sistema de arquivos do OpenClaw como write, edit ou apply_patch não torna exec somente leitura.
Aceita execução em primeiro plano + segundo plano via process. Se process não for permitido, exec roda de forma síncrona e ignora yieldMs/background.
Sessões em segundo plano têm escopo por agente; process só vê sessões do mesmo agente.
Parâmetros
commandstringrequiredComando shell a executar.
workdirstringdefault: cwdDiretório de trabalho para o comando.
envobjectSubstituições de ambiente chave/valor mescladas sobre o ambiente herdado.
yieldMsnumberdefault: 10000Coloca o comando automaticamente em segundo plano após este atraso (ms).
backgroundbooleandefault: falseColoca o comando em segundo plano imediatamente em vez de aguardar yieldMs.
timeoutnumberdefault: tools.exec.timeoutSecSubstitui o timeout de exec configurado para esta chamada. Defina timeout: 0 somente quando o comando deve rodar sem o timeout do processo exec.
ptybooleandefault: falseExecuta em um pseudoterminal quando disponível. Use para CLIs exclusivas de TTY, agentes de codificação e UIs de terminal.
host'auto' | 'sandbox' | 'gateway' | 'node'default: autoOnde executar. auto resolve para sandbox quando um runtime de sandbox está ativo e para gateway caso contrário.
security'deny' | 'allowlist' | 'full'Ignorado para chamadas normais de ferramenta. A segurança de gateway / node é controlada por
tools.exec.security e pelo arquivo de aprovações do host; o modo elevado pode
forçar security=full somente quando o operador concede explicitamente acesso elevado.
ask'off' | 'on-miss' | 'always'O modo base de solicitação vem de tools.exec.ask e das aprovações do host.
Para chamadas de modelo originadas de canais, ask por chamada é ignorado quando o
ask efetivo do host é off; caso contrário, ele só pode endurecer para um modo
mais estrito. Chamadores internos/API confiáveis que constroem ferramentas exec com um
valor ask explícito permanecem inalterados.
nodestringID/nome do Node quando host=node.
elevatedbooleandefault: falseSolicita modo elevado — escapa do sandbox para o caminho de host configurado. security=full é forçado somente quando elevated resolve para full.
Observações:
hostusaautopor padrão: sandbox quando o runtime de sandbox está ativo para a sessão; caso contrário, Gateway.hostaceita somenteauto,sandbox,gatewayounode. Ele não é um seletor de hostname; valores semelhantes a hostnames são rejeitados antes de o comando rodar.autoé a estratégia de roteamento padrão, não um curinga.host=nodepor chamada é permitido a partir deauto;host=gatewaypor chamada só é permitido quando nenhum runtime de sandbox está ativo.tools.exec.modeé o controle de política normalizado. Os valores sãodeny,allowlist,ask,autoefull.autoexecuta correspondências determinísticas de allowlist/safe-bin diretamente e roteia todos os casos restantes de aprovação de exec pelo revisor automático nativo do OpenClaw antes de perguntar a um humano.ask/ask=alwaysainda pergunta a um humano todas as vezes.- Sem configuração extra,
host=autoainda "simplesmente funciona": sem sandbox, ele resolve paragateway; com sandbox ativo, permanece no sandbox. elevatedescapa do sandbox para o caminho de host configurado:gatewaypor padrão, ounodequandotools.exec.host=node(ou o padrão da sessão éhost=node). Ele só está disponível quando o acesso elevado está habilitado para a sessão/provedor atual.- Aprovações de
gateway/nodesão controladas pelo arquivo de aprovações do host. noderequer um Node pareado (app companheiro ou host Node headless).- Se vários Nodes estiverem disponíveis, defina
exec.nodeoutools.exec.nodepara selecionar um. exec host=nodeé o único caminho de execução shell para Nodes; o wrapper legadonodes.runfoi removido.timeoutse aplica a execução em primeiro plano, em segundo plano,yieldMs, Gateway, sandbox esystem.rundo Node. Se omitido, o OpenClaw usatools.exec.timeoutSec;timeout: 0explícito desabilita o timeout do processo exec para essa chamada.- Em hosts não Windows, exec usa
SHELLquando definido; seSHELLforfish, ele preferebash(oush) dePATHpara evitar scripts incompatíveis com fish, depois volta paraSHELLse nenhum deles existir. - Em hosts Windows, exec prefere a descoberta do PowerShell 7 (
pwsh) (Program Files, ProgramW6432, depois PATH), depois volta para o Windows PowerShell 5.1. - Em hosts Gateway não Windows, comandos exec bash e zsh usam um snapshot de inicialização. O OpenClaw captura
aliases/funções passíveis de source e um pequeno conjunto seguro de ambiente de arquivos de inicialização do shell em
$OPENCLAW_STATE_DIR/cache/shell-snapshots/, depois faz source desse snapshot antes de cada comando exec. Variáveis que parecem secretas são excluídas; exec em sandbox e Node não usa esse snapshot. DefinaOPENCLAW_EXEC_SHELL_SNAPSHOT=0no ambiente do processo Gateway para desabilitar esse caminho de snapshot. - Execução no host (
gateway/node) rejeitaenv.PATHe substituições de loader (LD_*/DYLD_*) para impedir sequestro de binário ou código injetado. - O OpenClaw define
OPENCLAW_SHELL=execno ambiente do comando gerado (incluindo execução em PTY e sandbox) para que regras de shell/profile possam detectar o contexto da ferramenta exec. - Para execuções originadas de canal, o OpenClaw também expõe uma carga JSON estreita de identidade de remetente/chat em
OPENCLAW_CHANNEL_CONTEXTquando o canal forneceu esses IDs. openclaw channels loginé bloqueado deexecporque é um fluxo interativo de autenticação de canal; rode-o em um terminal no host Gateway ou use a ferramenta de login nativa do canal pelo chat quando existir.- Importante: sandboxing vem desativado por padrão. Se sandboxing estiver desativado,
host=autoimplícito resolve paragateway.host=sandboxexplícito ainda falha fechado em vez de rodar silenciosamente no host Gateway. Habilite sandboxing ou usehost=gatewaycom aprovações. - Verificações de preflight de scripts (para erros comuns de sintaxe shell em Python/Node) inspecionam apenas arquivos dentro do
limite efetivo de
workdir. Se um caminho de script resolve fora deworkdir, o preflight é ignorado para esse arquivo. - Para trabalho de longa duração que começa agora, inicie-o uma vez e conte com o despertar automático
de conclusão quando ele estiver habilitado e o comando emitir saída ou falhar.
Use
processpara logs, status, entrada ou intervenção; não emule agendamento com loops de sleep, loops de timeout ou polling repetido. - Para trabalho que deve acontecer depois ou em uma agenda, use Cron em vez de
padrões de sleep/atraso com
exec.
Configuração
tools.exec.notifyOnExit(padrão: true): quando true, sessões exec colocadas em segundo plano enfileiram um evento do sistema e solicitam um Heartbeat ao sair.tools.exec.approvalRunningNoticeMs(padrão: 10000): emite um único aviso "em execução" quando um exec bloqueado por aprovação roda por mais tempo que isso (0 desabilita).tools.exec.timeoutSec(padrão: 1800): timeout exec padrão por comando em segundos.timeoutpor chamada o substitui;timeout: 0por chamada desabilita o timeout do processo exec.tools.exec.host(padrão:auto; resolve parasandboxquando o runtime de sandbox está ativo,gatewaycaso contrário)tools.exec.security(padrão:denypara sandbox,fullpara Gateway + Node quando não definido)tools.exec.ask(padrão:off)- Exec de host sem aprovação é o padrão para Gateway + Node. Se você quiser comportamento de aprovações/allowlist, endureça tanto
tools.exec.*quanto o arquivo de aprovações do host; veja Aprovações de exec. - YOLO vem dos padrões de política do host (
security=full,ask=off), não dehost=auto. Se quiser forçar roteamento por Gateway ou Node, definatools.exec.hostou use/exec host=.... - No modo
security=fullmaisask=off, o exec de host segue diretamente a política configurada; não há camada extra de pré-filtro heurístico de ofuscação de comandos nem rejeição por preflight de script. tools.exec.node(padrão: não definido)tools.exec.strictInlineEval(padrão: false): quando true, formas inline de eval de interpretador comopython -c,node -e,ruby -e,perl -e,php -r,lua -eeosascript -eexigem revisor ou aprovação explícita. Emmode=auto, o caminho normal de aprovação de exec pode permitir que o revisor automático nativo autorize um comando pontual claramente de baixo risco; chamadas diretassystem.runem host Node ainda exigem uma aprovação explícita porque não conseguem entregar o comando a uma rota de aprovação humana. Se o revisor perguntar, a solicitação vai para um humano.allow-alwaysainda pode persistir invocações benignas de interpretador/script, mas formas inline-eval não se tornam regras allow duráveis.tools.exec.commandHighlighting(padrão: false): quando true, prompts de aprovação podem destacar trechos de comando derivados do parser no texto do comando. Defina comotrueglobalmente ou por agente para habilitar o destaque do texto do comando sem alterar a política de aprovação de exec.tools.exec.pathPrepend: lista de diretórios para antepor aPATHem execuções exec (somente Gateway + sandbox).tools.exec.safeBins: binários seguros somente stdin que podem rodar sem entradas explícitas de allowlist. Para detalhes de comportamento, veja Binários seguros.tools.exec.safeBinTrustedDirs: diretórios explícitos adicionais confiáveis para verificações de caminho desafeBins. Entradas dePATHnunca são confiadas automaticamente. Os padrões integrados são/bine/usr/bin.tools.exec.safeBinProfiles: política argv personalizada opcional por binário seguro (minPositional,maxPositional,allowedValueFlags,deniedFlags).
Exemplo:
{ tools: { exec: { pathPrepend: ["~/bin", "/opt/oss/bin"], }, },}Tratamento de PATH
host=gateway: mescla oPATHdo seu login-shell no ambiente exec. Substituições deenv.PATHsão rejeitadas para execução no host. O daemon em si ainda roda com umPATHmínimo:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin- Para impedir que a configuração do shell do usuário (como
~/.zshenvou/etc/zshenv) substitua caminhos prioritários durante a inicialização, entradas detools.exec.pathPrependsão antepostas com segurança aoPATHfinal dentro do comando shell logo antes da execução.
- Para impedir que a configuração do shell do usuário (como
- macOS:
host=sandbox: rodash -lc(login shell) dentro do contêiner, então/etc/profilepode redefinirPATH. O OpenClaw antepõeenv.PATHapós o source do profile por meio de uma variável de ambiente interna (sem interpolação de shell);tools.exec.pathPrependtambém se aplica aqui.host=node: somente substituições de env não bloqueadas que você passar são enviadas ao Node. Substituições deenv.PATHsão rejeitadas para execução no host e ignoradas por hosts Node. Se você precisar de entradas PATH adicionais em um Node, configure o ambiente do serviço do host Node (systemd/launchd) ou instale ferramentas em locais padrão.
Vinculação de Node por agente (use o índice da lista de agentes na configuração):
openclaw config get agents.listopenclaw config set 'agents.list[0].tools.exec.node' "node-id-or-name"Control UI: a aba Nodes inclui um pequeno painel "Vinculação de Node exec" para as mesmas configurações.
Substituições de sessão (/exec)
Use /exec para definir padrões por sessão para host, security, ask e node.
Envie /exec sem argumentos para mostrar os valores atuais.
Exemplo:
/exec host=auto security=allowlist ask=on-miss node=mac-1Modelo de autorização
/exec só é respeitado para remetentes autorizados (listas de permissão/pareamento de canais mais commands.useAccessGroups).
Ele atualiza somente o estado da sessão e não grava a configuração. Remetentes autorizados de canais externos podem
definir esses padrões da sessão. Clientes internos de gateway/webchat precisam de operator.admin para persistir esses padrões.
Para desabilitar exec de forma rígida, negue-o pela política de ferramentas (tools.deny: ["exec"] ou por agente). Aprovações do host
ainda se aplicam, a menos que você defina explicitamente security=full e ask=off.
Aprovações de exec (aplicativo complementar / host node)
Agentes em sandbox podem exigir aprovação por solicitação antes que exec seja executado no gateway ou no host node.
Consulte Aprovações de exec para a política, a lista de permissão e o fluxo da UI.
Quando aprovações são exigidas, a ferramenta exec retorna imediatamente com
status: "approval-pending" e um id de aprovação. Depois de aprovada (ou negada / expirada),
o Gateway emite eventos de sistema de progresso e conclusão do comando apenas para execuções aprovadas
(Exec running / Exec finished). Aprovações negadas ou expiradas são terminais e não
acordam a sessão do agente com um evento de sistema de negação.
Em canais com cartões/botões nativos de aprovação, o agente deve depender primeiro dessa
UI nativa e incluir um comando manual /approve somente quando o resultado da ferramenta
disser explicitamente que aprovações pelo chat não estão disponíveis ou que a aprovação manual é o
único caminho.
Lista de permissão + bins seguros
A aplicação manual da lista de permissão corresponde a globs de caminho binário resolvido e globs de nome de comando
sem caminho. Nomes sem caminho correspondem apenas a comandos invocados por PATH, portanto rg pode corresponder a
/opt/homebrew/bin/rg quando o comando é rg, mas não a ./rg ou /tmp/rg.
Quando security=allowlist, comandos shell são permitidos automaticamente apenas se cada segmento de pipeline
estiver na lista de permissão ou for um bin seguro. Encadeamento (;, &&, ||) e redirecionamentos
são rejeitados no modo de lista de permissão, a menos que cada segmento de nível superior satisfaça a
lista de permissão (incluindo bins seguros). Redirecionamentos continuam sem suporte.
A confiança durável allow-always não contorna essa regra: um comando encadeado ainda exige que cada
segmento de nível superior corresponda.
autoAllowSkills é um caminho de conveniência separado nas aprovações de exec. Não é o mesmo que
entradas manuais de lista de permissão de caminhos. Para confiança explícita estrita, mantenha autoAllowSkills desabilitado.
Use os dois controles para trabalhos diferentes:
tools.exec.safeBins: filtros de fluxo pequenos, somente stdin.tools.exec.safeBinTrustedDirs: diretórios confiáveis extras explícitos para caminhos executáveis de bins seguros.tools.exec.safeBinProfiles: política argv explícita para bins seguros personalizados.- lista de permissão: confiança explícita para caminhos executáveis.
Não trate safeBins como uma lista de permissão genérica e não adicione binários de interpretador/runtime (por exemplo, python3, node, ruby, bash). Se você precisar deles, use entradas explícitas de lista de permissão e mantenha prompts de aprovação habilitados.
openclaw security audit avisa quando entradas safeBins de interpretador/runtime estão sem perfis explícitos, e openclaw doctor --fix pode estruturar entradas safeBinProfiles personalizadas ausentes.
openclaw security audit e openclaw doctor também avisam quando você adiciona explicitamente bins de comportamento amplo, como jq, de volta a safeBins.
Se você permitir explicitamente interpretadores na lista de permissão, habilite tools.exec.strictInlineEval para que formas de avaliação de código inline ainda exijam revisor ou aprovação explícita.
Para detalhes e exemplos completos da política, consulte Aprovações de exec e Bins seguros versus lista de permissão.
Exemplos
Primeiro plano:
{ "tool": "exec", "command": "ls -la" }Segundo plano + consulta:
{"tool":"exec","command":"npm run build","yieldMs":1000}{"tool":"process","action":"poll","sessionId":"<id>"}A consulta é para status sob demanda, não para loops de espera. Se o despertar automático por conclusão estiver habilitado, o comando pode acordar a sessão quando emitir saída ou falhar.
Enviar teclas (estilo 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"]}Enviar (envia apenas CR):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }Colar (com delimitadores por padrão):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }apply_patch
apply_patch é uma subferramenta de exec para edições estruturadas em vários arquivos.
Ela é habilitada por padrão para modelos OpenAI e OpenAI Codex. Use configuração somente
quando quiser desabilitá-la ou restringi-la a modelos específicos:
{ tools: { exec: { applyPatch: { workspaceOnly: true, allowModels: ["gpt-5.5"] }, }, },}Observações:
- Disponível apenas para modelos OpenAI/OpenAI Codex.
- A política de ferramentas ainda se aplica;
allow: ["write"]permite implicitamenteapply_patch. deny: ["write"]não negaapply_patch; negueapply_patchexplicitamente ou usedeny: ["group:fs"]quando gravações de patch também devem ser bloqueadas.- A configuração fica em
tools.exec.applyPatch. tools.exec.applyPatch.enabledtem padrãotrue; defina comofalsepara desabilitar a ferramenta para modelos OpenAI.tools.exec.applyPatch.workspaceOnlytem padrãotrue(contido no workspace). Defina comofalsesomente se você quiser intencionalmente queapply_patchgrave/exclua fora do diretório do workspace.
Relacionados
- Aprovações de Exec — portões de aprovação para comandos shell
- Sandboxing — execução de comandos em ambientes em sandbox
- Processo em Segundo Plano — exec de longa duração e ferramenta process
- Segurança — política de ferramentas e acesso elevado