Files

65 lines
1.8 KiB
Python

"""
Skill : EXEC
Exécute une commande shell sur le système et retourne le résultat.
Commande :
EXEC: <commande shell>
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)