English Abstract
Shell_exec.cgi is an environment that decapsulate CGI format. It allows to easily build CGI-scripts in UNix-shell. It was initially designed to teach the principles of internet programming in an easy way.
The rest is in french... sorry ;-)
Introduction
Shell_exec.cgi est un script CGI déballant le contenu d'un formulaire HTML et le transformant sous la forme de variables d'environnement d'un script shell. Ainsi, avec , vous pouvez facilement rédiger des script CGI en langage de commandes d'Unix.
shell_exec.cgi est programmé en Ada95 et utilise le paquetage CGI de David A. Wheeler (wheeler@ida.org).
Vous pouvez inclure librement shell_exec.cgi dans toute distribution à la condition expresse de référencer le nom de l'auteur et son organisme d'origine ainsi que celui de David A. Wheeler.
Installation
shell_exec.cgi est un exécutable qui s'installe dans le répertoire cgi-bin de tout serveur web sous Unix. Cette opération peut exiger l'intervention d'un ingénieur système
shell_exec.cgi doit être configur pour exécuter un script shell accessible par le serveur httpd qui le lance. Pour paramétrer shell_exec.cgi, il faut définir :
- le chemin absolu du programme shell à exécuter.
- la liste des répertoires dans lesquels on peut trouver des commandes à exécuter (sera ajoutée à la variable d'environnement PATH du serveur exécutant le script shell). Les différents chemins absolus des répertoires sont séparés par un ":", comme dans la variable d'environnement PATH.
- le chemin absolu d'un fichier dans lequel les traces générées sur stderr seront redirigées. Attention, les droits d'écriture doivent être positionnés pour ce fichier s'il existe déjà ou le répertoire contenant ce fichier doit permettre la création d'un répertoire.
Ces trois paramètres sont transmis au moyen de "boutons cachés" dont les noms sont respectivement: SCRIPT_PATH (1), ADD_PATH (2), ERRORF_PATH (3). L'absence de valeur pour la variable ERRORF_PATH provoque l'affichage des traces de stderr dans la fenêtre de réponse, en rouge sur fond rose.
Ainsi, le paramétrage d'un formulaire utilisant l'environnement shell_exec.cgi se fera de la manière suivante:
- le script shell doit avoir les droits d'exécution pour "others" (l'utilisateur "fictif" nobody qui exécute httpd n'appartenant en général à aucun groupe).
- les chemins pour le stockage des données et la sortie des erreurs doivent avoir des droits en écriture pour "others" (même raison que précédemment).
Un exemple simple
Considérons un exemple minimal composé d'un formulaire HTML est d'un programme en langage de commande d'Unix.
Voici le code du formulaire. Nous indiquons en rouge les zones qui doivent être modifiées de manière adéquate lorsque vous installerez le serveur. les valeurs données sont alors indicatives.
<title>exemple shell_exec</title>
</head>
<body>
<form action="http://mon_site/cgi-bin/shell_exec.cgi" method="POST">
<h2>Saisissez votre nom et titre</h2>
<input type="hidden" name="SCRIPT_PATH" value="/chez_moi/mon_script">
<input type="hidden" name="ADD_PATH" VALUE="/home/chez_moi/programmes">
<input type="hidden" name="ERRORF_PATH" value="/tmp/traces">
<select name="titre">
<option selected>Madame
<option>Monsieur
</select> - <input type="text" name="NOM" value="" SIZE=15
MAXLENGTH=15> - <input type="submit" name="Envoi" value="Soumettre">
</p></form></body></html>
Voici le code du script shell qui génère une page HTML simple. Les variables correspondant aux champs du formulaire sont notées en rouge. Elles sont accessibles dans l'environnement d'exécution du script shell référencé via le bouton caché SCRIPT_PATH
echo "<h3> Bonjour $TITRE $NOM </h3>"
echo "</body><html>"
Limitations
shell_exec.cgi impose quelques contraintes, essentiellement dues à la manière dont il transmet les champs du formulaire. Ainsi, les effets ne sont pas garantis lorsque :
- le formulaire contient des zones de saisies de type textarea (des surprises peuvent survenir dans la transmission des sauts de ligne),
- le formulaire contient des select dans lesquels il est possible de sélectionner plusieurs valeurs (mêmes surprises dans la transmission des sauts de lignes).
Pour ne pas insérer un trou de sécurité sur la machine ou il est installé, shell_exec.cgi effectue quelques vérifications sur le chemin du script qui lui est transmis en paramètre dans le bouton SCRIPT_PATH :
- interdiction du caractère "espace",
- interdiction du caractère "tabulation",
- interdiction du caractère "|",
- interdiction du caractère ">",
- interdiction du caractères "<",
- interdiction du caractère ";",
Ainsi, seul un chemin absolu référençant un script shell installé sur la machine serveur peut-être exécuté.
Enfin, 20 secondes de temps CPU sont allouées aux scripts shell invoqués via shell_exec.cgi.
Téléchargement
Vous pouvez télécharger les sources de la version 2.1. Les versions exploitées à l'UPMC (cours en DEUG MIAS) ont été compilées avec gnat.
Crédits
- Si vous utilisez shell_exec.cgi et avez des suggestions d'améliorations, contactez moi.
- shell_exec.cgi a été développé par Fabrice Kordon au Laboratoire d'Informatique de Paris 6
- shell_exec.cgi a été développé en Ada95.
- shell_exec.cgi utilise le CGI de David A. Wheeler (wheeler@ida.org)
La version actuelle date de Février 2004.