Executer un script shell depuis un script .php
Fermé
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
-
Modifié par mamiemando le 28/04/2016 à 21:46
mamiemando Messages postés 33574 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 14 mars 2025 - 3 mai 2016 à 10:36
mamiemando Messages postés 33574 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 14 mars 2025 - 3 mai 2016 à 10:36
A voir également:
- Shell script php
- Script vidéo youtube - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
- Easy php - Télécharger - Divers Web & Internet
- Microsoft activation script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
4 réponses
mamiemando
Messages postés
33574
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mars 2025
7 833
28 avril 2016 à 21:56
28 avril 2016 à 21:56
Inutile de faire un
Note que si tu peux attribuer ce fichier à n'importe quel utilisateur autre que root si tu préfères du moment que ce n'est pas www-data et que cet utilisateur peut légitimement écrire dans ce fichier. Si par exemple ton profil utilisateur est toto, tu peux donc l'attribuer à toto.
Idem pour mon
Ok maintenant il faut que quand les commandes shell mise en jeu (donc
... mais personnellement, je te conseille de plutôt utiliser des chemins absolus. Du coup ton script shell deviendra :
.... et ton script php :
Note que pour que cette commande shell_exec soit correcte, il faut s'assurer que cette fonction peut effectivement sortir du DocumentRoot de ton VirtualHost. Typiquement si c'est /var/www/monsite, tu ne pourrais pas accéder à un fichier en dehors de /var/www/mon/site. Assure toi que ce n'est pas bloquant dans ce cas.
Bonne chance
chmod 777 monscript.php: ce fichier est lu par l'utilisateur qui lance le serveur web (typiquement l'utilisateur
www-data), il suffit donc que ce fichier appartienne au groupe en question et ait les droits en lecture :
cd /var/www/monsite/
chmod 640 monscript.php
chown root:www-data monscript.php
Note que si tu peux attribuer ce fichier à n'importe quel utilisateur autre que root si tu préfères du moment que ce n'est pas www-data et que cet utilisateur peut légitimement écrire dans ce fichier. Si par exemple ton profil utilisateur est toto, tu peux donc l'attribuer à toto.
Idem pour mon
script.shsi tu explicites l'interpréteur (ici
bash) : dans ce cas le fichier n'est pas exécuté (c'est
bashqui l'est), et
bashne fait que lire le fichier
script.sh. Comme
bashest exécuté par ton serveur web, c'est donc toujours le même utilisateur
www-dataqui est en jeu, et donc il est suffisant de lui mettre les mêmes droits :
chmod 640 script.sh
chown root:www-data script.sh
Ok maintenant il faut que quand les commandes shell mise en jeu (donc
/bin/bashet
/usr/sbin/etherwake), leur répertoire soit dans la variable d'environnement PATH de l'utilisateur qui lance ces commandes (donc toujours www-data), ou que tu donnes leur chemin absolu. Pour voir le PATH de www-data tu peux regarder ce que donne :
su - www-data
echo $PATH
... mais personnellement, je te conseille de plutôt utiliser des chemins absolus. Du coup ton script shell deviendra :
#!/bin/bash
/usr/sbin/etherwake -i eth0 00:11:22:33:44:55
.... et ton script php :
<?php shell_exec ('/home/monscript.sh'); ?>
Note que pour que cette commande shell_exec soit correcte, il faut s'assurer que cette fonction peut effectivement sortir du DocumentRoot de ton VirtualHost. Typiquement si c'est /var/www/monsite, tu ne pourrais pas accéder à un fichier en dehors de /var/www/mon/site. Assure toi que ce n'est pas bloquant dans ce cas.
Bonne chance
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
29 avril 2016 à 17:44
29 avril 2016 à 17:44
Bonsoir,
Dans un primer tempo, j'ai essayé votre méthode en renseignant les chemins absolus
a savoir
Pour le sh:
#!/bin/bash
/usr/sbin/etherwake -i eth0 00:11:22:33:44:55
Pour le .php :
<?php shell_exec ('/var/www/monscript.sh'); ?>
J'ai donc placé mon .sh dans le même dossier que mon .php pour essayer de contourner le problème d'accès des fichier
j'espère avoir compris la logique..
Mais cela ne fonctionne pas.
Dans un primer tempo, j'ai essayé votre méthode en renseignant les chemins absolus
a savoir
Pour le sh:
#!/bin/bash
/usr/sbin/etherwake -i eth0 00:11:22:33:44:55
Pour le .php :
<?php shell_exec ('/var/www/monscript.sh'); ?>
J'ai donc placé mon .sh dans le même dossier que mon .php pour essayer de contourner le problème d'accès des fichier
j'espère avoir compris la logique..
Mais cela ne fonctionne pas.
mamiemando
Messages postés
33574
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mars 2025
7 833
2 mai 2016 à 10:19
2 mai 2016 à 10:19
Vérifie que les chemins sont corrects. Je suppose qu'etherwake requiert des droits root pour être exécuté avec succès, souviens-toi qu'a priori c'est l'utilisateur www-data qui va l'exécuter. Du coup il faudrait que www-data soit sudoer sur cette commande (voir
https://www.atrixnet.com/allow-an-unprivileged-user-to-run-a-certain-command-with-sudo/
Bonne chance
sudo).
https://www.atrixnet.com/allow-an-unprivileged-user-to-run-a-certain-command-with-sudo/
Bonne chance
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
2 mai 2016 à 19:02
2 mai 2016 à 19:02
Bonsoir,
je suis allez voir votre lien:
Est ce que je dois rajouter la ligne
www-data ALL=(ALL:ALL) ALL
??
Je vois bien les deux autres utilisateurs a savoir
root:
root ALL=(ALL:ALL) ALL
et pi:
pi ALL=(ALL) NOPASSWD: ALL
je suis allez voir votre lien:
Est ce que je dois rajouter la ligne
www-data ALL=(ALL:ALL) ALL
??
Je vois bien les deux autres utilisateurs a savoir
root:
root ALL=(ALL:ALL) ALL
et pi:
pi ALL=(ALL) NOPASSWD: ALL
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
2 mai 2016 à 19:17
2 mai 2016 à 19:17
Pour voir si le problème vient d'etherwake ou non j'ai créé un petit script.sh qui contient :
#!/bin/bash
touch test.txt
Je l'ai rendu exécutable et je lui ai donné tous les droits avec chmod 777 test.sh
Lorsque je fais : bash test.sh cela fonctionne parfaitement
J'ai fais de même en créant un test.php
<?php shell_exec ('/var/www/test.sh'); ?>
Donc normalement si j'appel mon test.php,
il devrait exécuter mon test.sh
et mon test.sh devrait créer mon fichier test.txt
Et déjà là, cela ne le créé pas.Donc le problème ne vient pas des droits d'etherwake.
#!/bin/bash
touch test.txt
Je l'ai rendu exécutable et je lui ai donné tous les droits avec chmod 777 test.sh
Lorsque je fais : bash test.sh cela fonctionne parfaitement
J'ai fais de même en créant un test.php
<?php shell_exec ('/var/www/test.sh'); ?>
Donc normalement si j'appel mon test.php,
il devrait exécuter mon test.sh
et mon test.sh devrait créer mon fichier test.txt
Et déjà là, cela ne le créé pas.Donc le problème ne vient pas des droits d'etherwake.
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
2 mai 2016 à 19:26
2 mai 2016 à 19:26
J'ai encore avancé un peu...(on fait ce qu'on peux comme on peux ^^)
j'ai voulu m'assurer que mon test.php fonctionné bien .
Du coup j'ai trouvé la commande suivante :
php -f test.php
et là ;-) mon fichier test.txt est bien généré !
le problème vient bien de mon appel depuis l'extérieur ...
c'est peu mais ça avance...
j'ai voulu m'assurer que mon test.php fonctionné bien .
Du coup j'ai trouvé la commande suivante :
php -f test.php
et là ;-) mon fichier test.txt est bien généré !
le problème vient bien de mon appel depuis l'extérieur ...
c'est peu mais ça avance...
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
2 mai 2016 à 20:11
2 mai 2016 à 20:11
2 ème bonne nouvelle, j'ai ouvert les droits des dossiers var et de www
Du coup lorsque j'appel mon fichier test.php depuis un autre post, celui-ci génère bien le fichier test.txt ;-)
Du coup, sur le meme principer, j'ai ouvert les droits des dossiers sur et sbin pour accéder a etherwake...mais ceci ne fonctionne pas
Encor un petit pas en avant ;-)
Du coup lorsque j'appel mon fichier test.php depuis un autre post, celui-ci génère bien le fichier test.txt ;-)
Du coup, sur le meme principer, j'ai ouvert les droits des dossiers sur et sbin pour accéder a etherwake...mais ceci ne fonctionne pas
Encor un petit pas en avant ;-)
none61
Messages postés
83
Date d'inscription
mercredi 23 avril 2014
Statut
Membre
Dernière intervention
14 avril 2020
2 mai 2016 à 20:28
2 mai 2016 à 20:28
J'ai visiblement trouvé la solution a mon problème ;-)
J'ai commencer par restreindre les droit de www-data seulement pour etherwake
sudo visudo
www-data ALL=(ALL) NOPASSWD: /usr/sbin/etherwake
ensuite dans mon fichier won.sh j'ai just rajouté sudo avant l'arborescence:
#!/bin/bash
sudo /usr/sbin/etherwake -i eth0 00:11:22:33:44:55
voila j'ai fait plusieurs essais d'allumer le pc avec un navigateur web et...ça marche !!!
Encore merci a vous pour m'avoir aidé !
J'ai commencer par restreindre les droit de www-data seulement pour etherwake
sudo visudo
www-data ALL=(ALL) NOPASSWD: /usr/sbin/etherwake
ensuite dans mon fichier won.sh j'ai just rajouté sudo avant l'arborescence:
#!/bin/bash
sudo /usr/sbin/etherwake -i eth0 00:11:22:33:44:55
voila j'ai fait plusieurs essais d'allumer le pc avec un navigateur web et...ça marche !!!
Encore merci a vous pour m'avoir aidé !
mamiemando
Messages postés
33574
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
14 mars 2025
7 833
3 mai 2016 à 10:36
3 mai 2016 à 10:36
Félicitations :-)
Je vois au travers de cette progression que tu as compris petit à petit où je voulais en venir avec mon message précédent. La démarche pour comprendre le problème que tu as suivie est effectivement la bonne pour déduire que c'est un problème de droits (par rapport à celui qui existe le script, en l'occurrence www-data).
Passons à la minute culture :-)
En fait pour résoudre ton problème, il y a plusieurs écoles. Je t'ai fait suivre celle qui me paraissait la meilleure :
1) on aurait pu utiliser un bit set-uid sur script.sh, mais c'est très dangereux d'un point de vue sécurité. En outre ça peut permettre à d'autres utilisateurs d'exécuter ce script et donc
https://fr.wikipedia.org/wiki/Setuid
2) si
3) changer les droits de l'exécutable etherwake revient à relâcher les droits correspondants, et donc à plus de gens de l'exécuter (la pire manière étant le hélas bien trop connu chmod 777 qui est le meilleur moyen d'ouvrir un trou de sécurité). C'est donc à proscrire absolument.
4) la méthode sudo (que je t'ai proposée) présente l'avantage d'être propre, claire, et de centraliser (cf visudo) les permissions spéciales qu'on a pu allouer à certains utilisateurs. Soyons clairs : c'est fait pour. Le seul inconvénient c'est que ça force à installer
https://doc.ubuntu-fr.org/sudo
5) une autre possibilité, spécifique à apache, aurait été d'utiliser suexec. Mais elle peut également être dangereuse et revient à installer une variante de
https://httpd.apache.org/docs/trunk/fr/suexec.html
Bonne continuation :-)
Je vois au travers de cette progression que tu as compris petit à petit où je voulais en venir avec mon message précédent. La démarche pour comprendre le problème que tu as suivie est effectivement la bonne pour déduire que c'est un problème de droits (par rapport à celui qui existe le script, en l'occurrence www-data).
Passons à la minute culture :-)
En fait pour résoudre ton problème, il y a plusieurs écoles. Je t'ai fait suivre celle qui me paraissait la meilleure :
1) on aurait pu utiliser un bit set-uid sur script.sh, mais c'est très dangereux d'un point de vue sécurité. En outre ça peut permettre à d'autres utilisateurs d'exécuter ce script et donc
etherwakealors qu'ils ne sont pas sensés en avoir le droit, et donc il aurait fallu dans ce script faire un contrôle fin et s'assurer que le script est sans faille. C'est l'approche utilisée par exemple par les commandes comme
passwd(voir
ls -l $(which passwd)). Comme c'est dangereux c'est une méthode que je déconseille autant que possible.
https://fr.wikipedia.org/wiki/Setuid
2) si
etherwakeappartient à groupe particulier qui permet d'exécuter cette commande. C'est assez contextuel (ça dépend de la commande), rien ne garantit qu'un tel groupe ait ces droits et en général ce n'est pas le cas. Son côté généralement inapplicable me l'a fait écarter d'entrée.
3) changer les droits de l'exécutable etherwake revient à relâcher les droits correspondants, et donc à plus de gens de l'exécuter (la pire manière étant le hélas bien trop connu chmod 777 qui est le meilleur moyen d'ouvrir un trou de sécurité). C'est donc à proscrire absolument.
4) la méthode sudo (que je t'ai proposée) présente l'avantage d'être propre, claire, et de centraliser (cf visudo) les permissions spéciales qu'on a pu allouer à certains utilisateurs. Soyons clairs : c'est fait pour. Le seul inconvénient c'est que ça force à installer
sudo, mais on va dire que c'est régulièrement installé. Je ne rentre pas dans les détails puisque tu l'as déjà décrite.
https://doc.ubuntu-fr.org/sudo
5) une autre possibilité, spécifique à apache, aurait été d'utiliser suexec. Mais elle peut également être dangereuse et revient à installer une variante de
sudo. Ça ne change à mon sens pas forcément grand chose, car il faudra de toute façon l'installer, la configurer etc... L'intérêt de la méthode
sudoest qu'elle est plus générale, pas forcément limité au cas de figure apache.
https://httpd.apache.org/docs/trunk/fr/suexec.html
Bonne continuation :-)
28 avril 2016 à 22:07
Je n'ai pas compris toute la réponse, surtout la parité DocumentRoot mais déjà cela va me permettre d'avancer ;-)
Je vais essayer demain et je reviens vers vous .
29 avril 2016 à 10:18