""" Skill : EXEC Exécute une commande shell sur le système et retourne le résultat. Commande : EXEC: Exemples : EXEC: apt list --upgradable EXEC: systemctl status nginx EXEC: df -h EXEC: docker ps -a """ import subprocess from shlex import split as shlex_split SKILL_NAME = "shell_exec" TRIGGER = "EXEC:" TIMEOUT = 30 # secondes max par commande MAX_CHARS = 3000 # taille max de l'output retourné # Commandes interdites même en contexte de confiance BLACKLIST = ["rm -rf /", "mkfs", ":(){:|:&};:", "dd if=/dev/zero of=/dev/sd"] def execute(args: str) -> str: cmd = args.strip() if not cmd: return "Erreur : commande vide." # Vérification blacklist basique for forbidden in BLACKLIST: if forbidden in cmd: return "Commande refusée pour des raisons de sécurité : {}".format(forbidden) try: result = subprocess.run( cmd, shell=True, capture_output=True, text=True, timeout=TIMEOUT ) stdout = result.stdout.strip() stderr = result.stderr.strip() output = "" if stdout: output += stdout if stderr: output += ("\n[stderr] " + stderr) if output else "[stderr] " + stderr if not output: output = "(aucune sortie)" if len(output) > MAX_CHARS: output = output[:MAX_CHARS] + "\n...[tronqué]" status = "OK" if result.returncode == 0 else "Erreur (code {})".format(result.returncode) return "[{}] $ {}\n{}".format(status, cmd, output) except subprocess.TimeoutExpired: return "Timeout : la commande a dépassé {}s : {}".format(TIMEOUT, cmd) except Exception as e: return "Erreur d'exécution : {}".format(e)