Rechercher : dans
Par :

Executer un script shell avec apache

Dernière réponse le 18 aoû 2009 à 18:00:02 maxabi, le 27 déc 2008 à 10:40:08 
 Signaler ce message aux modérateurs

Bonjour,

au fait, je bosse sur la mise en place d'un serveur web (apache) sous RHEL 4. je m'y connais pas assez en PHP et HTML
il m'a été donné un index.php (code php, dont je vous ferai voir le contenu plus loin )qui parait-il lorsqu'il sera lancé à partir de la barre d'adresse de n'importe kel naviguateur en local devrait soit redemarrer , demarrer , ou stopper l'application. IL fo mentionner ken ligne de commande , l'application s'execute correctement. Parait il ke ce code en PHP devrait executer des instructions d'un script shell (dont vs verrez aussi le contenu). Pour me résumer, il faut qu'à la demande de index.php , le serveur puisse executer (demarrage , stop.......).
Je n'ai donc pas ce resultat mais sur ma page n'affiche que ceci ;

Shutting down smsbox (kannel 1.4.1): Shutting down bearerbox (kannel 1.4.1):
Starting bearer service (gateway kannel 1.4.1): Starting smsbox service (gateway kannel 1.4.1):

bienque le serveur ne respectant pas le statut affiché:

code php

<?php
$ligne = system('smsicomd stop ');
echo " $ligne <br> ";
$ligne1 = system('smsicomd start');
echo $ligne1;
?>

script shell

#!/bin/sh
#
# smsicomd This shell script takes care of starting and stopping
# the Kannel WAP gateway (bearer/wapbox)
#
# chkconfig: 2345 97 03
# description: Start and stop the Kannel WAP gateway used to fetch \
# some WML content from a Web server & compile it \
# into WMLC mobile phone bytecode.
# probe: true

# Use start-stop-daemon
ver=1.4.1
BBOX=/usr/local/sbin/bearerbox
SBOX=/usr/local/sbin/smsbox
START="/usr/local/sbin/start-stop-daemon --start --background --quiet --exec"
STOP="/usr/local/sbin/start-stop-daemon --stop --quiet --oknodo --exec"
CONF=/etc/kannel/kannel.conf
[ $# -eq 2 ] && ver=$2

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -x $BBOX ] || exit 0

[ -x $SBOX ] || exit 0

[ -f $CONF ] || exit 0


RETVAL=0

smsicomd

sleep 1 # Sleep for a while before we try to start smsbox
echo
echo -n "Starting smsbox service (gateway kannel $ver): "
$START $SBOX -- $CONF
RETVAL2=$?
echo
echo
[ $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smsicomd ||\
RETVAL=1
;;
stop)
# Stop daemons.
echo -n "Shutting down smsbox (kannel $ver): "
$STOP $SBOX
RETVAL2=$?
echo
echo -n "Shutting down bearerbox (kannel $ver): "
$STOP $BBOX
RETVAL1=$?
echo
[ $RETVAL1 -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smsicomd
echo ""
;;
status)
status bearerbox
status smsbox
exit $?
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: named {start|stop|status|restart}"
exit 1
esac
exit $RETVAL

Configuration: Linux Red Hat
Firefox 1.0

Configuration: RHEL4
Firefox 2.0.0.20

Meilleures réponses pour « executer un script shell avec apache » dans :
Exécuter un script shell Voir Exécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...

1

Flachy Joe, le 27 déc 2008 à 18:38:23

Salut,
tu as sans doute un problème de droit d'exécution :
- ton script PHP s'exécute en tant qu'utilisateur www-data
- ton script shell à besoin des droits super utilisateur pour lancer les application situées dans /usr/local/sbin

Tu peut modifier le fichier de config /etc/sudoers pour autoriser l'exécution de ce programme par www-data en tant que root.
;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

2

maxabi, le 29 déc 2008 à 11:25:39

Merci a toi flash joe, je suis autodidacte . parait que c chmod 755 donne tous les droits au superuser?

Répondre à maxabi

3

Flachy Joe, le 29 déc 2008 à 12:51:15

Lit cette doc : http://howto.monserveurperso.com/guide.andesi.org/ksudo.html­#AEN6525

Ne modifie pas les droits sur les fichiers contenu dans /usr/local/sbin avec chmod, ils ne doivent être exécutable que par root. C'est grâce à ce genre de verrouillage que linux est plus sécurisé que windows... ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

4

maxabi, le 29 déc 2008 à 18:32:43

Infiniment merci, mais flachy joe je me cherche toujours. je rafraichi mon pb.
en ligne de commande , notre serveur réagit normalment à la commande ki lui est envoyé. je rapel que le script qui régit cette commande est de type shell(donc un CGI , si je me trompe rectifier moi). Apache que j'utilise heberge index.php qui est censé , à la demande permettre d'administrer notre serveur comme on pourrait le faire à partir de la ligne de commande. tous ces scripts se trouvent au sein de mon 1er message.je me demande parfois aussi si apache est bien configurer pour bien interpréter les CGI, ou si c le code php ki n'est pas assez argumenté, ou comme l'a dit joe c un bleme de droit d'accès. Mais, mon probleme secondaire est que je sais pas aussi me prendre pour ces autorisation.

PS: mon script shell se trouve dans un repertoire du type /usr/local/sbin
j'ai aussi essayé de le recopier ds /var/www/cgi-bin et lorsque je lance la requête appelant le fichier il s'affiche tel kel.
mais lorsque je fais appel a mon code php ki était censé changer le status du serveur déja démarré en ligne de commande, il affiche ke soit le serveur a changé d'état ( arrêté, redémarré,..)mais en réalité non.

merci par avance

Répondre à maxabi

5

Flachy Joe, le 5 jan 2009 à 14:20:47

Voila comment faire en sorte que ta commande soit lancée avec les droit superuser :
1. Installe sudo sur le serveur

su
apt-get install sudo

2. Édite le fichier /etc/sudoers avec la commande visudo
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias      REBOOT = /etc/init.d/smsicomd

# User privilege specification
root    ALL=(ALL) ALL
www-data NOPASSWD: REBOOT

3. Déplace ton script smsicomd dans /etc/init.d puis fait en root
cd /etc/init.d
chown root smsicomd
chmod 700 smsicomd

4. Tes appels à ce script se feront maintenant automatiquement en tant que root et ne demanderont pas de mot de passe. ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

6

maxabi, le 5 jan 2009 à 18:18:17

Merci pour ta disponibilité, en fait je l'ai fait , mais lorsque je demande a travers un naviguateur le fichier en php qui est censé exécuter par exemple la commande smsicomd restart, il m'affiche que le serveur smsicom a restart ,mais en réalité en ligne de cmd le status du serveur smsicom indique qu'il a gardé son statu d'avant . je rappel ke mon fichier en php est logé ds /var/www/php/ , j'ai mêm essayé de placé le script shell de smsicomd ds ce repertoire , mais jai tjrs rien.
j'ai aussi essayé de le placer dans /var/www/cgi-bin/ dont je constate que j'ai pas accès .
merci

Répondre à maxabi

7

Flachy Joe, le 5 jan 2009 à 18:50:30

As tu rajouté sudo devant ta commande ?

<?php
$ligne = system('sudo /etc/init.d/smsicomd stop ');
echo $ligne.'<br>';
$ligne1 = system(sudo etc/init.d/'smsicomd start');
echo $ligne1;
?> 


J'ai testé avec /etc/init.d/ssh et ça marche chez moi.
;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks

Répondre à Flachy Joe

8

maxabi, le 6 jan 2009 à 13:38:20

Flachy, peux tu m'expliquer ces cmd (surtout le REBOOT) du /etc/sudoers.parait qu'à mon niveau , il existe une erreur de syntaxe au niveau de la ligne:

root ALL=(ALL) ALL,

même commenté l'erreur subsiste.
Je me pose aussi la question de savoir s'il était encore nécessaire de préciser cette ligne pour le super user.

Répondre à maxabi

9

Flachy Joe, le 6 jan 2009 à 13:50:54

L'erreur est à la ligne suivante en fait :

www-data ALL = NOPASSWD: REBOOT

Pour l'explication :
Cmnd_Alias définie une liste de commande qui sera valable pour le reste de la config, ici on définie la liste REBOOT qui contient uniquement le script à exécuter.

La ligne www-data ... détermine de quel façon cet utilisateur va pouvoir utiliser sudo : sur toutes les machines accessibles (en fait uniquement localhost...) sans mot de passe et uniquement la liste REBOOT.

Il vaut mieux garder la ligne pour root, qui lui permet de lancer n'importe quelle commande sur n'importe quelle machine, pour peu qu'il fournisse son mot de passe. ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

10

maxabi, le 6 jan 2009 à 14:28:58

Merci infiniment merci,
jai une otre inquiétude sur le type d'utilisateur www-data ; o fait c l'utilisateur "apache non? si oui , j'ai comme l'impression que ce dernier est un utilisateur particulier, cad sous lequel on ne peut pas ouvrir une session avec un mot de passe comme c le cas pour les otres user créés.
Puisque sa marche pas encore , j'ai voulu pluto placer mon script shell dans /var/www/cgi-bin. Mais il se fait que par défaut le user apache n'accède pas à ce repertoire. alors je me suis demandé s'il fo aussi le préciser dans le /etc/sudoers?

Répondre à maxabi

11

Flachy Joe, le 6 jan 2009 à 15:27:46

En effet le user www-data n'a pas de mot de passe (même effet que passwd -d) ce qui interdit son login (c'est aussi ce qu'on fait normalement avec root quand on a sudo correctement configuré cf http://doc.ubuntu-fr.org/root).

Mais ça n'empêche en rien le lancement de script par la méthode que j'ai décrit.
Si ton script est à la bonne place, et ton sudoers correctement configuré, alors tu peux le lancer avec sudo /chemin/absolu/vers/le/script.sh start

Il faut aussi le chemin absolue dans sudoers. ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

12

maxabi, le 6 jan 2009 à 18:49:09

Mais jarrive toujours pas.Je me demande si mon code PHP est correcte. Au fait mon smsicomd s'execute en ligne de cmd normalement. ton SSH , tu l''executes à partir d'un code Php?

A présent , je suppose que juste en plaçant mon scrpt SHELL ds /var/www/cgi-bin/ et en donnant tous les droits au user apache sur ce repertoire, et en configurant de façon conséquente mon serveur web de façon à bien interpréter les CGI, JY ARRIVERAI, mais je sais pas comment me prendre. J'insiste surtout sur les droits d'accès au repertoir /../cgi-bin/, puisque j'ai tjrs eu des erreurs du type FORBIDDEN . NE VS LASSEZ PAS DE MOI MERCI

Répondre à maxabi

13

Flachy Joe, le 6 jan 2009 à 19:13:00

Voila pas à pas ce que j'ai fait pour arrêter et relancer le service ssh depuis un script PHP, le script utilisé est celui qui ce lance lors du démarrage et de l'arrêt de l'ordi :

1. Le script est /etc/init.d/ssh, je n'y ai pas touché, ni déplacé, ni changé les droit, il est en user root et -rwxr--r--
2. J'ai modifié le sudoers de cette façon :

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification
Cmnd_Alias      SSH = /etc/init.d/ssh

# User privilege specification
root    ALL=(ALL) ALL
www-data ALL= NOPASSWD: SSH
3. J'ai modifié ton code PHP (enregistré dans /var/www/ssh.php) :
<?php
$ligne = system('sudo /etc/init.d/ssh stop ');
echo $ligne.'<br>';
//Commenté pour tester dans une console avec /etc/init.d/ssh status
//$ligne1 = system('sudo /etc/init.d/ssh start');
//echo $ligne1;
?>
4. J'ai lancé http://localhost/ssh.php

Tu n'as aucune chance de réussir à arrêter un service sans les droits du super user, or si tu lances comme un CGI, il aura les droits de www-data. ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks

Répondre à Flachy Joe

14

maxabi, le 8 jan 2009 à 12:58:50

Flachy , j'ai repris sans modification ta demarche que j'ai appliqué , mais c le statuquo(aucun changement), je me demande comment tu as configuré ton serveur www-data pour que ça marche à ton niveau,


Et puis pour ce ki concerne mon rep /var/www/cgi-bin/ j''arrive toujours pas à accéder malgré que je l'ai changé de propriétaire et de groupe (apache) et que je l'ai rendu executable par tous.
merci par avance

Répondre à maxabi

15

Flachy Joe, le 8 jan 2009 à 13:57:28

J'ai rien configuré, j'ai la config par défaut de l'install apache2 pour Debian Lenny.
Juste encore un test : qu'est ce que ce code t'affiche ?

<?php
passthru('sudo -l');
?>

;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. » Les Shadoks

Répondre à Flachy Joe

16

maxabi, le 8 jan 2009 à 15:21:07

Lorsque je lance http://localhost/lecode
je n'ai rien qui s'afffiche à l'écran
merci

Répondre à maxabi

17

Flachy Joe, le 10 jan 2009 à 12:15:10

Tu n'as pas activé le safe-mode au moins ?
Sinon (http://www.php.net/manual/fr/ini.sect.safe-mode.php#ini.saf­e-mode-exec-dir)
Si PHP est utilisé en safe mode, les fonctions comme system() et toutes celles qui permettent l'exécution en ligne de commande refuseront d'exécuter des programmes qui ne sont pas dans ce dossier. Vous devez utiliser / en tant que séparateur de dossier sous tous les environnements, y compris Windows. ;-) Flachy Joe ;-)
« Il vaut mieux mobiliser son intelligence sur des conneries­ que mobiliser sa connerie sur des choses intelligentes. » L­es Shadoks

Répondre à Flachy Joe

18

maxabi, le 12 jan 2009 à 12:41:20
  • +1

Le safe_mode n'est pas activé dans mon php.ini ; je peux jeter un coup d'oeil sur ton fichier httpd? Que je comparerai au mien .merci

Répondre à maxabi

19

maxabi, le 30 jan 2009 à 13:15:43

SALUT
j'ai toujours pas réussi à exécuter mon application "smsicomd" depuis mon code php que ce soit avec exec, passthru ou system,; malgré les différents modifications (edition du sudo, chmod 755 , chown apache).en fait , je n'obtiens en lançant mon code php ds la barre d'adresse que les phrases qui suivent "echo" du script shell (smsicomd), du genre '"starting bearerbox, starting smsbox" si par exple dans mon code php j'ai la commande "smsicomd start".Mais dans les faits, l'application ne s'est pas lancé. Alors QU'EN LIGNE DE CMDE , la même commande la lance.
Une autre possibilité , celle d'exécuter le script shell en mode cgi, se révèle aussi infructive, et pour cause , refus d'accès au repertoire /cgi-bin. Alors que je suis allé même chowner (apache) et chmoder (755) tous ce qui était contenu dans /var/www/.
avez- vs une proposition pour moi?
MERCI a vous tous et a flachyjoe.

Répondre à maxabi

20

 nico, le 18 aoû 2009 à 18:00:02

J'ai exactement le meme problème que toi, j'ai passer des heures à essayer de trouver la solution mais pas moyen. Je sais juste envoyer des commandes de bases (ls,cd etc).Si tu as trouvé la solution pourrait tu l'as poster.
meric d'avance

Répondre à nico