Documentation / Commandes

Lancer des scripts avec execute

Mis à jour le

TL;DR — `tokenade execute --lang python --script '…'` exécute un script avec un environnement nettoyé, un délai de 30 secondes par défaut et une sortie plafonnée à 1 Mio, et ne renvoie que stdout. Envoyez-lui les données par un pipe pour les filtrer là où elles sont produites. Ce n'est pas un bac à sable de sécurité.

tokenade execute exécute un court script et ne vous rend que ce qu'il affiche. Servez-vous-en quand la réponse est une valeur dérivée (un compte, un filtre, une somme) et que les données d'origine coûteraient cher dans le contexte de votre agent. Alias : exec, run-script.

Utilisation

tokenade execute --lang <name> [--script CODE | -] [--cwd DIR] \
[--timeout SECS] [--cap BYTES] [--no-compact] [--no-redact]
tokenade execute --list # show supported interpreters
OptionDéfautEffet
--lang <name>obligatoirebash, sh, python, node, ruby, awk, jq, perl
--script CODECode à exécuter. --script - lit le script sur l'entrée standard
--script-file FLit le script depuis un fichier, sans échappement shell à gérer
--cwd DIRrépertoire courantRépertoire de travail
--timeout SECS30 (max 600)Tue le script après ce nombre de secondes
--cap BYTES1 Mio (max 16 Mio)Plafond de la sortie standard
--no-compactdésactivéSaute le compacteur appliqué après exécution
--no-redactdésactivéSaute le masquage des secrets (déconseillé)
--sandboxdésactivéExécute sous bubblewrap (bwrap) : tout le système de fichiers en lecture seule, un /tmp neuf en écriture, pas de réseau. Aussi TOKENADE_EXEC_SANDBOX=1
--sandbox-netdésactivéAutorise le réseau dans le bac à sable. Aussi TOKENADE_EXEC_SANDBOX_NET=1
--listAffiche les interpréteurs pris en charge et quitte
--jsonAvec --list, affiche les interpréteurs en JSON

Ce que « sandbox » veut dire ici

Par défaut, le script tourne dans un processus séparé avec un environnement nettoyé, un délai maximal et des plafonds de sortie. Ce n'est pas une prison au niveau des appels système : il s'exécute sous votre identité, avec votre système de fichiers et votre réseau. Traitez un script lancé ici exactement comme si vous le lanciez dans votre propre shell.

--sandbox ajoute un vrai confinement sous Linux grâce à bubblewrap. Si bwrap n'est pas installé, execute refuse de s'exécuter plutôt que de tourner sans confinement.

Exemples

$ tokenade execute --list
Available interpreters:
bash (binary: bash)
sh (binary: sh)
python (binary: python3)
node (binary: node)
ruby (binary: ruby)
awk (binary: awk)
jq (binary: jq)
perl (binary: perl)
$ tokenade execute --lang python --script 'print(sum(range(101)))'
5050

Les données envoyées par un pipe arrivent sur l'entrée standard du script ; une grosse sortie est donc réduite là où elle est produite :

$ cat orders.json | tokenade execute --lang python \
--script 'import json,sys; print(len(json.load(sys.stdin)["items"]))'
2

Un script long ou plein de guillemets est plus simple depuis un fichier :

tokenade execute --lang python --script-file ./count_errors.py < build.log

Codes de sortie

CodeSignification
Code du scriptexecute renvoie le code de sortie du script (sys.exit(3) donne 3)
255Délai dépassé. La sortie produite avant l'arrêt est conservée
127--lang inconnu

En cas de délai dépassé, le message indique comment l'augmenter :

tokenade execute: timed out after 1.01s (ceiling 1s). Raise it with `--timeout <secs>` (max 600), or narrow the script. …

Pièges

  • jq tourne avec -n. Lisez les données reçues explicitement avec input : --script 'input | .items | length'. Un simple .items | length ne voit aucune entrée et affiche 0.
  • --script - utilise l'entrée standard pour le script lui-même : vous ne pouvez donc pas y envoyer de données en plus. Même chose pour un script bash ou sh de plus de 64 Kio. Utilisez plutôt --script-file.
  • Par défaut, la sortie est masquée (secrets), puis compactée et plafonnée. Si le résultat semble tronqué, augmentez --cap ou réduisez ce que le script affiche.
  • Gardez des scripts courts. execute sert aux calculs jetables ; un code que vous allez modifier et relancer a sa place dans un vrai fichier.

Voir aussi