Tools
Ferramenta de execução
Execute comandos de shell no workspace. exec é uma superfície de shell mutável: os comandos podem criar, editar ou excluir arquivos onde quer que o sistema de arquivos do host ou sandbox selecionado permita. Desabilitar ferramentas de sistema de arquivos do OpenClaw, como write, edit ou apply_patch, não torna exec somente leitura.
Oferece suporte à execução em primeiro e segundo plano por meio de process. Se process não for permitido, exec será executado de forma síncrona e ignorará yieldMs/background. As sessões em segundo plano têm escopo por agente; process só vê sessões do mesmo agente.
Parâmetros
commandstringrequiredComando de shell a ser executado.
workdirstringdefault: cwdDiretório de trabalho do comando.
envobjectSubstituições de ambiente de chave/valor mescladas sobre o ambiente herdado.
yieldMsnumberdefault: 10000Coloca automaticamente o comando 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 tempo limite de exec configurado para esta chamada, em segundos. Aplica-se à execução em primeiro plano, em segundo plano, com yieldMs, no gateway, no sandbox e em system.run do node. timeout: 0 desabilita o tempo limite do processo exec para essa chamada.
ptybooleandefault: falseExecuta em um pseudoterminal quando disponível. Use para CLIs exclusivas de TTY, agentes de programação e interfaces de terminal.
host'auto' | 'sandbox' | 'gateway' | 'node'default: autoOnde executar. auto é resolvido como sandbox quando um runtime de sandbox está ativo e como gateway caso contrário.
security'deny' | 'allowlist' | 'full'Ignorado em chamadas normais de ferramentas. 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 básico de solicitação vem de tools.exec.ask e das aprovações do host. Para chamadas de modelo originadas em canais, o ask por chamada é ignorado quando a solicitação efetiva do host é off; caso contrário, ele só pode restringir para um modo mais rigoroso. Chamadores internos/de API confiáveis que constroem ferramentas exec com um valor ask explícito permanecem inalterados.
nodestringID/nome do Node quando host=node.
elevatedbooleandefault: falseSolicita o modo elevado: sai do sandbox para o caminho configurado do host. security=full só é forçado quando o modo elevado é resolvido como full.
Observações:
hostaceita somenteauto,sandbox,gatewayounode. Ele não é um seletor de nome de host; valores semelhantes a nomes de host são rejeitados antes da execução do comando.host=nodepor chamada é permitido a partir deauto;host=gatewaypor chamada só é permitido quando nenhum runtime de sandbox está ativo.- Sem configuração adicional,
host=autoainda "simplesmente funciona": sem sandbox, ele é resolvido comogateway; com um sandbox ativo, permanece no sandbox. elevatedsai do sandbox para o caminho configurado do host: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/o provedor atual.- As aprovações de
gateway/nodesão controladas pelo arquivo de aprovações do host. noderequer um Node pareado (aplicativo complementar ou host de Node sem interface gráfica). Se vários Nodes estiverem disponíveis, definaexec.nodeoutools.exec.nodepara selecionar um.exec host=nodeé o único caminho de execução de shell para Nodes; o wrapper legadonodes.runfoi removido.- Em hosts que não sejam Windows, exec usa
SHELLquando definido; seSHELLforfish, ele preferebash(oush) doPATHpara evitar construções de bash incompatíveis com fish e, em seguida, recorre aSHELLse nenhum deles existir. - Em hosts Windows, exec prioriza a descoberta do PowerShell 7 (
pwsh) (Program Files, ProgramW6432 e depois PATH) e, em seguida, recorre ao Windows PowerShell 5.1. - Em hosts Gateway que não sejam Windows, comandos exec de bash e zsh usam um snapshot de inicialização. O OpenClaw captura aliases/funções que podem ser carregados e um pequeno conjunto seguro de variáveis de ambiente dos arquivos de inicialização do shell em
$OPENCLAW_STATE_DIR/cache/shell-snapshots/e, em seguida, carrega esse snapshot antes de cada comando exec. Variáveis que aparentam conter segredos são excluídas; exec no sandbox e no Node não usa esse snapshot. DefinaOPENCLAW_EXEC_SHELL_SNAPSHOT=0no ambiente do processo do Gateway para desabilitar esse caminho de snapshot. - A execução no host (
gateway/node) rejeitaenv.PATHe substituições do carregador (LD_*/DYLD_*) para evitar sequestro de binários ou código injetado. - O OpenClaw define
OPENCLAW_SHELL=execno ambiente do comando iniciado (incluindo execução em PTY e sandbox) para que as regras do shell/perfil possam detectar o contexto da ferramenta exec. - Para execuções originadas em canais, o OpenClaw também expõe uma carga JSON restrita de identidade do remetente/chat em
OPENCLAW_CHANNEL_CONTEXTquando o canal fornece esses IDs. execnão pode executar comandos de shellopenclaw channels loginou/approve:openclaw channels loginé um fluxo interativo de autenticação de canal, e/approveprecisa passar pelo manipulador de comandos de aprovação, não por um shell. Execute o login do canal em um terminal no host Gateway ou use uma ferramenta de agente de login específica do canal quando houver uma (por exemplo,whatsapp_login).- Importante: o sandbox está desativado por padrão. Se o sandbox estiver desativado,
host=autoimplícito será resolvido comogateway.host=sandboxexplícito ainda falhará de forma segura, em vez de executar silenciosamente no host Gateway. Habilite o sandbox ou usehost=gatewaycom aprovações. - As verificações preliminares de scripts (para erros comuns de sintaxe de shell em Python/Node) inspecionam somente arquivos dentro do limite efetivo de
workdir. Se o caminho de um script for resolvido fora deworkdir, a verificação preliminar será ignorada para esse arquivo. A verificação preliminar também será totalmente ignorada quandohost=gatewaye a política efetiva forsecurity=fullcomask=off. - Para trabalhos de longa duração iniciados agora, inicie-os uma vez e confie no acionamento automático de conclusão quando ele estiver habilitado e o comando produzir saída ou falhar. Use
processpara logs, status, entrada ou intervenção; não simule agendamento com loops de suspensão, loops de tempo limite ou sondagens repetidas. - Para trabalhos que devem ocorrer posteriormente ou de forma agendada, use cron em vez de padrões de suspensão/atraso com
exec.
Configuração
| Chave | Padrão | Observações |
|---|---|---|
tools.exec.timeoutSec |
1800 |
Tempo limite padrão por comando exec, em segundos. O timeout por chamada o substitui; timeout: 0 por chamada desabilita o tempo limite do processo exec. |
tools.exec.host |
auto |
É resolvido como sandbox quando um runtime de sandbox está ativo e como gateway caso contrário. |
tools.exec.security |
deny para sandbox, full para gateway/node quando não definido |
|
tools.exec.ask |
off |
|
tools.exec.mode |
não definido | Controle de política normalizado. Consulte Modos abaixo. Não pode ser combinado com tools.exec.security/tools.exec.ask. |
tools.exec.reviewer.model |
modelo principal configurado do agente | Substituição opcional de provedor/modelo para a revisão de mode=auto. |
tools.exec.reviewer.timeoutMs |
30000 |
Tempo limite por etapa para a preparação e a conclusão do modelo revisor antes de recorrer a uma pessoa. |
tools.exec.node |
não definido | |
tools.exec.notifyOnExit |
true |
Quando verdadeiro, as sessões exec em segundo plano enfileiram um evento de sistema e solicitam um Heartbeat ao sair. |
tools.exec.approvalRunningNoticeMs |
10000 |
Emite uma única notificação de "em execução" quando uma execução exec sujeita a aprovação dura mais do que esse valor (0 desabilita). |
tools.exec.strictInlineEval |
false |
Consulte Avaliação inline. |
tools.exec.commandHighlighting |
false |
Quando verdadeiro, as solicitações de aprovação podem destacar trechos de comando derivados do analisador no texto do comando. Defina globalmente ou por agente; não altera a política de aprovação. |
tools.exec.pathPrepend |
não definido | Lista de diretórios a serem adicionados ao início de PATH para execuções exec (somente gateway + sandbox). |
tools.exec.safeBins |
não definido | Binários seguros somente para stdin que podem ser executados sem entradas explícitas na lista de permissões. Consulte Binários seguros. |
tools.exec.safeBinTrustedDirs |
/bin, /usr/bin |
Diretórios explícitos adicionais considerados confiáveis nas verificações de caminho de safeBins. Entradas de PATH nunca são consideradas confiáveis automaticamente. |
tools.exec.safeBinProfiles |
não definido | Política argv personalizada opcional por binário seguro (minPositional, maxPositional, allowedValueFlags, deniedFlags). |
A execução no host sem aprovação é o padrão para gateway e Node (security=full, ask=off) — isso vem dos padrões da política do host, não de host=auto. Se você quiser comportamento de aprovação/lista de permissões, restrinja tanto tools.exec.* quanto o arquivo de aprovações do host; consulte Aprovações de exec. Para forçar o roteamento para gateway ou Node independentemente do estado do sandbox, defina tools.exec.host ou use /exec host=....
Exemplo:
{ tools: { exec: { pathPrepend: ["~/bin", "/opt/oss/bin"], }, },}Modos
tools.exec.mode é o controle de política normalizado. Defini-lo deriva security/ask e ele não pode ser combinado com tools.exec.security/tools.exec.ask.
| Modo | security | ask | Comportamento |
|---|---|---|---|
deny |
deny |
off |
A execução é negada. |
allowlist |
allowlist |
off |
Somente comandos da lista de permissões ou de bins seguros são executados; nenhum outro solicita aprovação. |
ask |
allowlist |
on-miss |
As correspondências da lista de permissões são executadas diretamente; todo o restante solicita aprovação humana. |
auto |
allowlist |
on-miss |
As correspondências da lista de permissões ou de bins seguros são executadas diretamente; todo o restante passa pelo revisor automático nativo do OpenClaw antes de solicitar aprovação humana. |
full |
full |
off |
Não há controle de aprovação. |
ask/ask=always ainda solicita aprovação humana todas as vezes, independentemente do modo.
A aprovação da revisão automática é de uso único. No Gateway, o OpenClaw fornece ao revisor o caminho resolvido do executável e vincula a execução a esse mesmo caminho. Comandos que não podem ser reduzidos a um único plano de execução aplicável — como heredocs, expansões de shell ou uso de aspas não compatível em wrappers — voltam para a aprovação humana, mesmo que o modelo normalmente os permitisse.
As aprovações de comandos do app-server do Codex que ainda não tenham sido decididas por uma política explícita do runtime ou por uma política nativa usam a rota de aprovação humana. O OpenClaw não executa o revisor de execução configurado para essas solicitações porque o Codex não expõe um executável resolvido aplicável que possa vincular a decisão da revisão ao comando executado pelo Codex.
Avaliação inline (strictInlineEval)
Quando tools.exec.strictInlineEval é true, formas de avaliação inline do interpretador exigem aprovação do revisor ou aprovação explícita: python -c, node -e, ruby -e, perl -e, php -r, lua -e, osascript -e e formas semelhantes em outros interpretadores e transportadores de comandos compatíveis (awk, find -exec, make, sed, xargs e outros). Em mode=auto, o fluxo normal de aprovação de execução pode permitir que o revisor automático nativo aprove um comando pontual claramente de baixo risco; chamadas diretas de system.run no host Node ainda exigem aprovação explícita porque não podem encaminhar o comando para uma rota de aprovação humana. Se o revisor solicitar, a solicitação será encaminhada a uma pessoa. allow-always ainda pode persistir invocações benignas de interpretadores/scripts, mas as formas de avaliação inline não se tornam regras de permissão permanentes.
Tratamento de PATH
host=gateway: mescla oPATHdo seu shell de login no ambiente de execução. Substituições deenv.PATHsão rejeitadas para execução no host. O próprio daemon ainda é executado 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, as entradas detools.exec.pathPrependsão adicionadas com segurança ao início doPATHfinal dentro do comando de shell imediatamente antes da execução.
- macOS:
host=sandbox: executash -lc(shell de login) dentro do contêiner, portanto/etc/profilepode redefinir oPATH. O OpenClaw adicionaenv.PATHao início após carregar o perfil por meio de uma variável de ambiente interna (sem interpolação do shell);tools.exec.pathPrependtambém se aplica aqui.host=node: somente as substituições de ambiente não bloqueadas que você fornecer serão enviadas ao Node. Substituições deenv.PATHsão rejeitadas para execução no host e ignoradas pelos hosts Node. Se precisar de entradas adicionais no PATH de um Node, configure o ambiente do serviço do host Node (systemd/launchd) ou instale as 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"Interface de controle: a página Dispositivos inclui um pequeno painel "Vinculação de Node de execução" para as mesmas configurações.
Substituições da sessão (/exec)
Use /exec para definir os padrões por sessão de host, security, ask e node. Envie /exec sem argumentos para exibir os valores atuais.
Exemplo:
/exec host=auto security=allowlist ask=on-miss node=mac-1/exec só é respeitado para remetentes autorizados (listas de permissões/pareamento do canal 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 de sessão. Clientes internos do Gateway/webchat precisam de operator.admin para persisti-los.
Para desativar completamente a execução, negue-a por meio da política de ferramentas (tools.deny: ["exec"] ou por agente). As aprovações do host ainda se aplicam, a menos que você defina explicitamente security=full e ask=off.
Aprovações de execução (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 execução para conhecer a política, a lista de permissões e o fluxo da interface.
Quando uma aprovação humana é necessária, os fluxos do host Node e os fluxos não nativos do Gateway retornam imediatamente com status: "approval-pending" e um ID de aprovação. Os fluxos nativos de chat e da interface Web no Gateway podem, em vez disso, aguardar no próprio fluxo e retornar o resultado final do comando após a aprovação. Um resultado approval-pending significa que o comando ainda não foi iniciado; portanto, os avisos de fallback de primeiro plano só aparecem se o comando aprovado realmente for executado no próprio fluxo. Execuções assíncronas aprovadas emitem eventos de sistema de progresso e conclusão do comando (Exec running / Exec finished); aprovações negadas ou expiradas são terminais e não reativam a sessão do agente com um evento de sistema de negação.
Em canais com cartões/botões de aprovação nativos, o agente deve priorizar essa interface nativa e incluir um comando manual /approve somente quando o resultado da ferramenta disser explicitamente que as aprovações pelo chat não estão disponíveis ou que a aprovação manual é o único caminho.
Lista de permissões + bins seguros
A aplicação manual da lista de permissões corresponde a globs de caminhos resolvidos de binários e a globs de nomes simples de comandos. Nomes simples correspondem apenas a comandos invocados por meio do 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 de shell são permitidos automaticamente somente se cada segmento do pipeline estiver na lista de permissões ou for um bin seguro. Encadeamentos (;, &&, ||) e redirecionamentos são rejeitados no modo de lista de permissões, a menos que cada segmento de nível superior satisfaça a lista de permissões (incluindo bins seguros). Redirecionamentos continuam sem suporte. A confiança permanente de allow-always não ignora 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 execução e não equivale às entradas manuais de caminhos na lista de permissões. Para uma confiança explícita rigorosa, mantenha autoAllowSkills desativado.
Use os dois controles para finalidades diferentes:
tools.exec.safeBins: filtros pequenos de fluxo, somente por stdin.tools.exec.safeBinTrustedDirs: diretórios confiáveis adicionais explícitos para caminhos de executáveis de bins seguros.tools.exec.safeBinProfiles: política explícita de argv para bins seguros personalizados.- lista de permissões: confiança explícita em caminhos de executáveis.
Não trate safeBins como uma lista de permissões genérica e não adicione binários de interpretadores/runtimes (por exemplo, python3, node, ruby, bash). Se precisar deles, use entradas explícitas na lista de permissões e mantenha as solicitações de aprovação ativadas.
openclaw security audit avisa quando entradas de interpretadores/runtimes em safeBins não têm perfis explícitos, e openclaw doctor --fix pode criar a estrutura das entradas personalizadas ausentes em safeBinProfiles. openclaw security audit e openclaw doctor também avisam quando você adiciona explicitamente bins de comportamento amplo, como jq, novamente a safeBins (jq pode ler dados do ambiente e carregar código jq de módulos ou arquivos de inicialização; portanto, prefira entradas explícitas na lista de permissões ou execuções controladas por aprovação). jq é negado como bin seguro mesmo quando está explicitamente listado. Se você adicionar interpretadores explicitamente à lista de permissões, ative tools.exec.strictInlineEval para que as formas de avaliação inline de código ainda exijam aprovação do revisor ou aprovação explícita.
Para obter detalhes completos da política e exemplos, consulte Aprovações de execução e Bins seguros versus lista de permissões.
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 serve para verificar o status sob demanda, não para loops de espera. Se a reativação automática na conclusão estiver ativada, o comando poderá reativar a sessão quando emitir uma 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 somente 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 é ativada por padrão e está disponível para qualquer provedor de modelo; allowModels pode restringi-la. Use a configuração somente quando quiser desativá-la ou restringi-la a modelos específicos:
{ tools: { exec: { applyPatch: { workspaceOnly: true, allowModels: ["gpt-5.6-sol"] }, }, },}Observações:
- 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 as gravações de patches também precisarem ser bloqueadas.- A configuração fica em
tools.exec.applyPatch. tools.exec.applyPatch.enabledassumetruepor padrão; defina comofalsepara desativar a ferramenta.tools.exec.applyPatch.workspaceOnlyassumetruepor padrão (restrito ao espaço de trabalho). Defina comofalsesomente se quiser intencionalmente queapply_patchgrave/exclua fora do diretório do espaço de trabalho.tools.exec.applyPatch.allowModelsé uma lista de permissões opcional de IDs de modelos (simples, comogpt-5.4, ou completos, comoopenai/gpt-5.4). Quando definida, somente os modelos correspondentes recebem a ferramenta; quando não definida, todos os modelos a recebem.
Relacionado
- Aprovações de execução — controles de aprovação para comandos de shell
- Sandbox — execução de comandos em ambientes em sandbox
- Processo em segundo plano — ferramentas de execução e processo de longa duração
- Segurança — política de ferramentas e acesso elevado