Execution script .sh par un bouton sur une page web

Bonjour,

J’aimerai savoir comment faire pour exécuter de façon sûre des scripts .sh par le biais de “boutons” sur une page web. Il faudrait aussi que l’exécution soit sécurisé (qu’on ne puisse le faire que si on est authentifié sur la page par exemple) et que cette page ne donne accès qu’a l’exécution de ces scripts, et non leur édition ou toute autre action.

par exemple sur la page il y aurait :

[Bouton 1] [Démarrage] (et ça irait chercher /home/scripts/demarrage.sh)
[Bouton 2] [Arrêt] (et ça irait chercher /home/scripts/arret.sh)

Etc etc …
Mais j’ai un peu peur pour la sécurité, ne m’y connaissant pas du tout en php.
Est-ce possible d’exécuter un script shell par un script php de façon sécurisé?

Le but est de pouvoir donner à plusieurs personnes le pouvoir d’effectuer des actions précises et contrôlées sans pour autant leur donner un réel accès à la machine.

Merci d’avance.

Alors dans ton serveur web il faut se documenter sur un les fichiers .htaccess qui permettent de protéger une page.

En suite il faut du PHP qui via la fonction ci-dessous va executer tes scripts :
fr.php.net/manual/fr/function.system.php

Une autre méthode pour arriver à ton objectif c’est un serveur ssh et un login shell limité.

il est également possible de faire ça en cgi quand on ne veut pas PHP

C’est sécurisé et plus facile à faire ?

Autant sécurisé : c’est au niveau d’apache et des droits sur les fichiers que tu gères la sécurité
Un peu plus facile : Tu peux exécuter directement ton script shell sans passer par un autre langage comme php.

Voici un exemple de code à mettre dans le dossier /usr/lib/cgi-bin/

[code]#!/bin/sh
echo -e “Content-type: text/html\n”

our html code

echo ""
echo "My FOX page"
echo ""
echo "

Welcome to my FOX Board web page

"
echo "Hello World !"
echo ""
echo “”[/code]
Si ce code a pour nom hello.sh on pourra l’appeler dans un navigateur http://localhost/cgi-bin/hello.sh
Il faut que le code soit bien entendu exécutable. La commande suivante rend le script exécutable :

Il se peut que le dossier des cgi-bin soit différent. Il faudra dans ce cas vérifier le contenu du fichier /etc/apache2/sites-enabled/000-default

[code]cat /etc/apache2/sites-enabled/000-default


ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory “/usr/lib/cgi-bin”>
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

…[/code]

Cette méthode permet de comprendre les cgi-bin et c’est la base. Mais vu que tu ne connaissais pas cette méthode je suppose ton niveau te donneras beaucoup de mal à sécuriser ton site. Autant que tu fasses quelque chose comme le PHP qui va t’éviter de faire d’énorme trou de sécurité.

[]Introduction à la programmation des CGI
[
]Introduction à l’écriture de CGI

Ci-joint une doc sur perl-CGI qui m’a beaucoup appris sur CGI : http://perldoc.perl.org/CGI.html.
Après quand à conseiller ça plutôt que PHP je ne sais pas…j’aurais aussi tendance à conseiller PHP qui est plus utilisé que CGI de nos jours.
Par contre en terme de sécurité quand on débute on peut faire des erreurs quelque soit le langage donc le mieux est de lire de la doc qui sensibilise sur le sujet et de lire du code.
De mon côté CGI est réservé aux services HTTP qui ne prennent pas PHP et aux applications rrdtools.

C’est pas une question de langage. On pourrait très bien faire du php-cgi d’ailleurs.
Le CGI est abandonné de nos jours car il a l’inconvénient de lancer un nouveau processus à chaque fois qu’il doit fournir une page. C’est lourd en terme de performance si le site est fortement sollicité. On est passé à des modules inclus dans le serveur web (par exemple pour apache : mod_php ou mod_perl), qui ne lance qu’un seul processus : l’interpréteur qui sera capable d’exécuter le script plusieurs fois.

Pour utiliser un script shell au final, le problème sera le même, il faudra lancer un nouveau processus de bash pour interpréter, qu’il soit lancé directement via CGI ou par la fonction system() de php…

Pour faire ça de manière simple via php, en limitant l’accès avec un .htaccess.
D’abord tu choisis un couple user/mdp, et tu crées un fichier crypt.php qui contient :

<?php echo crypt('monpassword'); ?>
(tu peux supprimer le fichier ensuite)
Tu crées un fichier de mot de passe .htpasswd, que tu peux mettre à peu près n’importe où, qui contient une ligne du type user:mdpcrypté(récupéré avec le crypt.php)
Tu crées un fichier .htaccess, que tu mets dans le même dossier que le futur script php (ou tu mets dans ton userdir.conf)

AuthName "Page de gestion du serveur" AuthType Basic AuthUserFile "/chemin/vers/ton/fichier/de/mot/de/passe/.htpasswd" Require valid-user DirectoryIndex action.php
Normalement, si tu n’as pas touché à ça, la configuration d’apache empêche tout accès aux fichiers .htaccess/.htpasswd.
le script action.php (tu peux le renommer, mais change le DirectoryIndex du fichier .htaccess, sinon on pourra lister ton répertoire et donc on pourra ddl ton script)

[code]

Gestion du serveur

<?php if(!empty($_POST)) { if(!empty($_POST['arreter']) && empty($_POST['demarrer']))//On va arrêter le serveur, mais on vérifie que quelqu'un envoie pas l'instruction d'arrêt et de démarrage { if(shell_exec('ton shell /chemin/vers/ton/script/d/arrêt')) { echo 'Le serveur a bien été arrêté.
'; $msg_log='['.date("d\/m\/Y\ H\:i\:s").']['.$_SERVER['REMOTE_ADDR'].'] a arrêté le serveur, sans problème.'; shell_exec('echo '.$msg_log.'>>/chemin/vers/fichier/de/log/prefere.log'); unset($msg_log); //On enregistre(date +IP) qui éteint/allume le serveur. Le fichier de log doit être en 777 au niveau droit. } else { echo 'Un problème est survenu lors de l\'extinction.
'; $msg_log='['.date("d\/m\/Y\ H\:i\:s").']['.$_SERVER['REMOTE_ADDR'].'] a tenté d\'arrêter le serveur, mais un problème est survenu.'; shell_exec('echo '.$msg_log.'>>/chemin/vers/fichier/de/log/prefere.log'); unset($msg_log); } } if(!empty($_POST['demarrer']) && empty($_POST['arreter']))//Pareil, on vérifie qu'on essaye pas d'éteindre et de rallumer { if(shell_exec('ton shell /chemin/vers/ton/script/de/demarrage')) { echo 'Le serveur a bien été démarré.
'; $msg_log='['.date("d\/m\/Y\ H\:i\:s").']['.$_SERVER['REMOTE_ADDR'].'] a démarré le serveur, sans problème.'; shell_exec('echo '.$msg_log.'>>/chemin/vers/fichier/de/log/prefere.log'); unset($msg_log); //On enregistre(date + IP) qui éteint/allume le serveur. Le fichier de log doit être en 777 au niveau droit. } else { echo 'Un problème est survenu lors du démarrage.
'; $msg_log='['.date("d\/m\/Y\ H\:i\:s").']['.$_SERVER['REMOTE_ADDR'].'] a tenté de démarrer le serveur, mais un problème est survenu.'; shell_exec('echo '.$msg_log.'>>/chemin/vers/fichier/de/log/prefere.log'); unset($msg_log); } } } ?>

[/code] Je sais pas si le problème est toujours d'actualité, mais ça peut toujours servir à quelqu'un. J'ai commenté le code, n'hésite pas si tu as des questions !