Tools
Outil d’exécution
Exécute des commandes shell dans l’espace de travail. Prend en charge l’exécution au premier plan + en arrière-plan via process.
Si process est interdit, exec s’exécute de manière synchrone et ignore yieldMs/background.
Les sessions en arrière-plan sont limitées à chaque agent ; process ne voit que les sessions du même agent.
Paramètres
commandstringrequiredCommande shell à exécuter.
workdirstringRépertoire de travail de la commande.
envobjectRemplacements d’environnement clé/valeur fusionnés au-dessus de l’environnement hérité.
yieldMsnumberPasse automatiquement la commande en arrière-plan après ce délai (ms).
backgroundbooleanPasse immédiatement la commande en arrière-plan au lieu d’attendre yieldMs.
timeoutnumberRemplace le délai d’expiration exec configuré pour cet appel. Définissez timeout: 0 uniquement lorsque la commande doit s’exécuter sans délai d’expiration du processus exec.
ptybooleanExécute dans un pseudo-terminal lorsqu’il est disponible. À utiliser pour les CLI nécessitant un TTY, les agents de codage et les interfaces utilisateur de terminal.
host'auto' | 'sandbox' | 'gateway' | 'node'Où exécuter. auto se résout en sandbox lorsqu’un runtime de bac à sable est actif, et en gateway sinon.
security'deny' | 'allowlist' | 'full'Mode d’application pour l’exécution gateway / node.
ask'off' | 'on-miss' | 'always'Comportement de la demande d’approbation pour l’exécution gateway / node.
nodestringID/nom de Node lorsque host=node.
elevatedbooleanDemande le mode élevé — sortie du bac à sable vers le chemin d’hôte configuré. security=full n’est forcé que lorsque le mode élevé se résout en full.
Remarques :
hostvautautopar défaut : bac à sable lorsqu’un runtime de bac à sable est actif pour la session, sinon Gateway.hostn’accepte queauto,sandbox,gatewayounode. Ce n’est pas un sélecteur de nom d’hôte ; les valeurs ressemblant à des noms d’hôte sont rejetées avant l’exécution de la commande.autoest la stratégie de routage par défaut, pas un joker.host=nodepar appel est autorisé depuisauto;host=gatewaypar appel n’est autorisé que lorsqu’aucun runtime de bac à sable n’est actif.- Sans configuration supplémentaire,
host=autofonctionne quand même directement : l’absence de bac à sable signifie qu’il se résout engateway; un bac à sable actif signifie qu’il reste dans le bac à sable. elevatedsort du bac à sable vers le chemin d’hôte configuré :gatewaypar défaut, ounodelorsquetools.exec.host=node(ou lorsque la valeur par défaut de la session esthost=node). Il n’est disponible que lorsque l’accès élevé est activé pour la session/le fournisseur actuel.- Les approbations
gateway/nodesont contrôlées par~/.openclaw/exec-approvals.json. nodenécessite un Node appairé (application compagnon ou hôte Node sans interface).- Si plusieurs Nodes sont disponibles, définissez
exec.nodeoutools.exec.nodepour en sélectionner un. exec host=nodeest le seul chemin d’exécution shell pour les Nodes ; l’ancien wrappernodes.runa été supprimé.timeouts’applique à l’exécution au premier plan, en arrière-plan,yieldMs, Gateway, bac à sable etsystem.runde Node. S’il est omis, OpenClaw utilisetools.exec.timeoutSec;timeout: 0explicite désactive le délai d’expiration du processus exec pour cet appel.- Sur les hôtes non Windows, exec utilise
SHELLlorsqu’il est défini ; siSHELLestfish, il préfèrebash(oush) depuisPATHpour éviter les scripts incompatibles avec fish, puis revient àSHELLsi aucun des deux n’existe. - Sur les hôtes Windows, exec préfère la découverte de PowerShell 7 (
pwsh) (Program Files, ProgramW6432, puis PATH), puis revient à Windows PowerShell 5.1. - L’exécution sur l’hôte (
gateway/node) rejetteenv.PATHet les remplacements de chargeur (LD_*/DYLD_*) afin d’empêcher le détournement de binaire ou l’injection de code. - OpenClaw définit
OPENCLAW_SHELL=execdans l’environnement de la commande lancée (y compris l’exécution PTY et en bac à sable) afin que les règles de shell/profil puissent détecter le contexte de l’outil exec. openclaw channels loginest bloqué depuisexec, car il s’agit d’un flux interactif d’authentification de canal ; exécutez-le dans un terminal sur l’hôte Gateway, ou utilisez l’outil de connexion natif du canal depuis le chat lorsqu’il existe.- Important : le bac à sable est désactivé par défaut. Si le bac à sable est désactivé,
host=autoimplicite se résout engateway.host=sandboxexplicite échoue toujours de façon fermée au lieu de s’exécuter silencieusement sur l’hôte Gateway. Activez le bac à sable ou utilisezhost=gatewayavec des approbations. - Les contrôles préalables de scripts (pour les erreurs courantes de syntaxe shell Python/Node) n’inspectent que les fichiers situés dans la
limite effective de
workdir. Si un chemin de script se résout en dehors deworkdir, le contrôle préalable est ignoré pour ce fichier. - Pour les travaux de longue durée qui commencent maintenant, démarrez-les une seule fois et appuyez-vous sur le réveil
automatique à la fin lorsqu’il est activé et que la commande émet une sortie ou échoue.
Utilisez
processpour les journaux, l’état, l’entrée ou l’intervention ; n’émulez pas une planification avec des boucles de sommeil, des boucles de délai d’expiration ou des interrogations répétées. - Pour les travaux qui doivent se produire plus tard ou selon un calendrier, utilisez Cron au lieu des
motifs de sommeil/délai avec
exec.
Configuration
tools.exec.notifyOnExit(par défaut : true) : lorsque true, les sessions exec passées en arrière-plan mettent en file d’attente un événement système et demandent un Heartbeat à la sortie.tools.exec.approvalRunningNoticeMs(par défaut : 10000) : émet un unique avis « en cours d’exécution » lorsqu’un exec soumis à approbation s’exécute plus longtemps que cette durée (0 désactive).tools.exec.timeoutSec(par défaut : 1800) : délai d’expiration exec par commande par défaut, en secondes.timeoutpar appel le remplace ;timeout: 0par appel désactive le délai d’expiration du processus exec.tools.exec.host(par défaut :auto; se résout ensandboxlorsqu’un runtime de bac à sable est actif, engatewaysinon)tools.exec.security(par défaut :denypour le bac à sable,fullpour Gateway + Node lorsque non défini)tools.exec.ask(par défaut :off)- L’exécution exec hôte sans approbation est la valeur par défaut pour Gateway + Node. Si vous voulez un comportement d’approbations/liste d’autorisation, durcissez à la fois
tools.exec.*et le fichier hôte~/.openclaw/exec-approvals.json; consultez Approbations exec. - YOLO vient des valeurs par défaut de la politique d’hôte (
security=full,ask=off), pas dehost=auto. Si vous voulez forcer le routage Gateway ou Node, définisseztools.exec.hostou utilisez/exec host=.... - En mode
security=fullplusask=off, exec hôte suit directement la politique configurée ; il n’y a pas de préfiltre heuristique supplémentaire d’obfuscation de commande ni de couche de rejet de contrôle préalable de script. tools.exec.node(par défaut : non défini)tools.exec.strictInlineEval(par défaut : false) : lorsque true, les formes d’évaluation inline d’interpréteur telles quepython -c,node -e,ruby -e,perl -e,php -r,lua -eetosascript -enécessitent toujours une approbation explicite.allow-alwayspeut toujours persister des invocations bénignes d’interpréteur/script, mais les formes inline-eval affichent toujours une demande à chaque fois.tools.exec.pathPrepend: liste de répertoires à préfixer àPATHpour les exécutions exec (Gateway + bac à sable uniquement).tools.exec.safeBins: binaires sûrs uniquement en stdin pouvant s’exécuter sans entrées explicites de liste d’autorisation. Pour les détails de comportement, consultez Binaires sûrs.tools.exec.safeBinTrustedDirs: répertoires explicites supplémentaires approuvés pour les contrôles de cheminsafeBins. Les entréesPATHne sont jamais automatiquement approuvées. Les valeurs intégrées par défaut sont/binet/usr/bin.tools.exec.safeBinProfiles: politique argv personnalisée facultative par binaire sûr (minPositional,maxPositional,allowedValueFlags,deniedFlags).
Exemple :
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
Gestion de PATH
host=gateway: fusionne lePATHde votre shell de connexion dans l’environnement exec. Les remplacementsenv.PATHsont rejetés pour l’exécution sur l’hôte. Le daemon lui-même s’exécute toujours avec unPATHminimal :- macOS :
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux :
/usr/local/bin,/usr/bin,/bin
- macOS :
host=sandbox: exécutesh -lc(shell de connexion) dans le conteneur, donc/etc/profilepeut réinitialiserPATH. OpenClaw préfixeenv.PATHaprès le chargement du profil via une variable d’environnement interne (sans interpolation shell) ;tools.exec.pathPrepends’applique ici aussi.host=node: seuls les remplacements d’environnement non bloqués que vous transmettez sont envoyés au Node. Les remplacementsenv.PATHsont rejetés pour l’exécution sur l’hôte et ignorés par les hôtes Node. Si vous avez besoin d’entrées PATH supplémentaires sur un Node, configurez l’environnement du service de l’hôte Node (systemd/launchd) ou installez les outils dans des emplacements standard.
Liaison de Node par agent (utilisez l’index de la liste des agents dans la configuration) :
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Interface utilisateur de contrôle : l’onglet Nodes inclut un petit panneau « Liaison de Node exec » pour les mêmes paramètres.
Remplacements de session (/exec)
Utilisez /exec pour définir les valeurs par défaut par session de host, security, ask et node.
Envoyez /exec sans argument pour afficher les valeurs actuelles.
Exemple :
/exec host=auto security=allowlist ask=on-miss node=mac-1
Modèle d’autorisation
/exec n’est honoré que pour les expéditeurs autorisés (listes d’autorisation/appairage des canaux plus commands.useAccessGroups).
Il met à jour l’état de session uniquement et n’écrit pas la configuration. Pour désactiver exec de façon stricte, refusez-le via la
politique d’outil (tools.deny: ["exec"] ou par agent). Les approbations d’hôte s’appliquent toujours sauf si vous définissez explicitement
security=full et ask=off.
Approbations exec (application compagnon / hôte Node)
Les agents en bac à sable peuvent nécessiter une approbation par requête avant que exec ne s’exécute sur l’hôte Gateway ou Node.
Consultez Approbations exec pour la politique, la liste d’autorisation et le flux d’interface utilisateur.
Lorsque des approbations sont requises, l’outil exec retourne immédiatement avec
status: "approval-pending" et un ID d’approbation. Une fois approuvé (ou refusé / expiré),
le Gateway émet des événements système (Exec finished / Exec denied). Si la commande est toujours
en cours d’exécution après tools.exec.approvalRunningNoticeMs, un unique avis Exec running est émis.
Sur les canaux avec cartes/boutons d’approbation natifs, l’agent doit s’appuyer d’abord sur cette
interface native et n’inclure une commande /approve manuelle que lorsque le résultat de l’outil
indique explicitement que les approbations par chat sont indisponibles ou que l’approbation manuelle est le
seul chemin.
Liste d’autorisation + binaires sûrs
L’application manuelle de la liste d’autorisation fait correspondre les globs de chemins de binaires résolus et les globs
de noms de commande bruts. Les noms bruts ne correspondent qu’aux commandes invoquées via PATH, donc rg peut correspondre
à /opt/homebrew/bin/rg lorsque la commande est rg, mais pas à ./rg ni /tmp/rg.
Lorsque security=allowlist, les commandes shell sont autorisées automatiquement uniquement si chaque segment de pipeline
est dans la liste d’autorisation ou est un binaire sûr. Les chaînages (;, &&, ||) et les redirections
sont rejetés en mode liste d’autorisation sauf si chaque segment de niveau supérieur satisfait à la
liste d’autorisation (y compris les binaires sûrs). Les redirections restent non prises en charge.
La confiance durable allow-always ne contourne pas cette règle : une commande chaînée nécessite toujours que chaque
segment de niveau supérieur corresponde.
autoAllowSkills est un chemin de commodité distinct dans les approbations exec. Ce n’est pas la même chose que
les entrées manuelles de liste d’autorisation de chemins. Pour une confiance explicite stricte, gardez autoAllowSkills désactivé.
Utilisez les deux contrôles pour des tâches différentes :
tools.exec.safeBins: petits filtres de flux uniquement en stdin.tools.exec.safeBinTrustedDirs: répertoires approuvés explicites supplémentaires pour les chemins d’exécutables de binaires sûrs.tools.exec.safeBinProfiles: politique argv explicite pour les binaires sûrs personnalisés.- liste d’autorisation : confiance explicite pour les chemins d’exécutables.
Ne traitez pas safeBins comme une liste d’autorisation générique, et n’ajoutez pas de binaires d’interpréteur/d’environnement d’exécution (par exemple python3, node, ruby, bash). Si vous en avez besoin, utilisez des entrées explicites de liste d’autorisation et conservez les invites d’approbation activées.
openclaw security audit avertit lorsque des entrées safeBins d’interpréteur/d’environnement d’exécution n’ont pas de profils explicites, et openclaw doctor --fix peut générer le squelette des entrées personnalisées safeBinProfiles manquantes.
openclaw security audit et openclaw doctor avertissent également lorsque vous rajoutez explicitement des binaires à comportement large, comme jq, dans safeBins.
Si vous placez explicitement des interpréteurs sur liste d’autorisation, activez tools.exec.strictInlineEval afin que les formes d’évaluation de code en ligne nécessitent encore une nouvelle approbation.
Pour les détails complets de la politique et des exemples, consultez Approbations exec et Bins sûrs contre liste d’autorisation.
Exemples
Premier plan :
{ "tool": "exec", "command": "ls -la" }
Arrière-plan + interrogation :
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
L’interrogation sert à obtenir un état à la demande, pas à créer des boucles d’attente. Si le réveil automatique à la fin est activé, la commande peut réveiller la session lorsqu’elle émet une sortie ou échoue.
Envoyer des touches (style 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"]}
Soumettre (envoyer seulement CR) :
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
Coller (entre crochets par défaut) :
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
apply_patch
apply_patch est un sous-outil de exec pour les modifications structurées de plusieurs fichiers.
Il est activé par défaut pour les modèles OpenAI et OpenAI Codex. Utilisez la configuration uniquement
lorsque vous voulez le désactiver ou le restreindre à des modèles spécifiques :
{
tools: {
exec: {
applyPatch: { workspaceOnly: true, allowModels: ["gpt-5.5"] },
},
},
}
Remarques :
- Disponible uniquement pour les modèles OpenAI/OpenAI Codex.
- La politique d’outils s’applique toujours ;
allow: ["write"]autorise implicitementapply_patch. deny: ["write"]ne refuse pasapply_patch; refusez explicitementapply_patchou utilisezdeny: ["group:fs"]lorsque les écritures de correctifs doivent également être bloquées.- La configuration se trouve sous
tools.exec.applyPatch. tools.exec.applyPatch.enabledvauttruepar défaut ; définissez-le surfalsepour désactiver l’outil pour les modèles OpenAI.tools.exec.applyPatch.workspaceOnlyvauttruepar défaut (contenu dans l’espace de travail). Définissez-le surfalseuniquement si vous voulez intentionnellement queapply_patchécrive/supprime en dehors du répertoire de l’espace de travail.
Associé
- Approbations exec — barrières d’approbation pour les commandes shell
- Sandboxing — exécution de commandes dans des environnements en bac à sable
- Processus en arrière-plan — exec longue durée et outil de processus
- Sécurité — politique d’outils et accès élevé