Page 1 sur 1

[RESOLU] Exécution script python via page web

Posté : dim. 12 nov. 2017 19:09
par Xorax
Bonjour à tous,

j'ai depuis peu acquis un Raspberry PI et étant un débutant sur linux j'éprouve quelques difficultés. Notamment pour exécuter un script python via une page web, je m'explique :
Je souhaite gérer la position d'un servomoteur via un script php qui appellerai un script python. Pour m'exercer je souhaite donc pour le moment simplement allumer une LED depuis une page php.

J'ai donc installé mon serveur apache 2, placé le script python (test.py) suivant dans le répertoire /var/www/html :

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.OUT)
GPIO.output(16, GPIO.HIGH)
time.sleep(5)
GPIO.cleanup()


Mon script php ('servo.php') appelant le programme est le suivant et lui aussi dans le répertoire /var/www/html :

<?php
echo exec('whoami');
exec('sudo python /var/www/html/test.py');
exit();
?>


Lorsque j'exécute mon programme python depuis le raspberry avec la commande 'sudo python /var/www/html/test.py', pas de soucis ma LED s'allume bien.
Mais lorsque sur mon PC sur le même réseau local je souhaite exécuter mon script php via "adresseIPraspberry\servo.php" ma LED ne s'allume pas mais j'ai bien le résultat de ma commande "whoami" : www-data

En cherchant sur internet, j'ai été amené à changer les droits sur mon fichier test.py qui sont maintenant les suivants : -rwxrwxrwx 1 pi pi (En changeant pi par www-data le problème est le même).
J'ai également ajouté la ligne suivante dans mon fichier /etc/sudoers : www-data ALL=(ALL) NOPASSWD : /var/www/html/test.py dans la section #User privilege specification
Mais rien de nouveau.

Plus étrange, lorsque je remplace mon script python par un simple "print('test')" et en ajoutant "echo" devant ma commande exec de mon script php, le 'test' s'affiche bien comme si mon script python était bien exécuté.
J'ai donc essayé d'ajouter des print un peu partout dans mon programme test.py et ils s'affichent correctement jusqu'à la ligne "GPIO.setup(16, GPIO.OUT)".

J'ai déjà fait pas mal de recherches et ne comprend pas vraiment d'où pourrait venir le problème (bibliothèque GPIO inaccessible depuis user www-data ?).
Merci d'avance pour votre aide.

Re: Exécution script python via page web

Posté : dim. 12 nov. 2017 19:17
par jelopo
Bonjour,

Belle présentation, on comprends très bien où tu en es dans ton problème :geek: . Je pense que tu es très prêt du résultat.
En fait tu lance en sudo "python" et non test.py. Puisque tu as mis le shebang python dans ton script qui est en plus exécutable, essaies de voir si ce serait pas un poil mieux de lancer ton script comme ceci :

Code : Tout sélectionner

sudo /var/www/html/test.py
A+

Re: Exécution script python via page web

Posté : dim. 12 nov. 2017 20:22
par Xorax
Bonjour Jelopo et merci pour ta réponse rapide !
J'ai essayé ta solution et tu avais vu juste ! Le script s'exécute maintenant correctement depuis ma page php. Merci beaucoup !

Pour ma culture personnelle :
Si j'ai bien compris la commande "sudo /var/www/html/test.py" va exécuter mon fichier et celui-ci avec l'en-tête va comprendre que c'est un fichier à exécuter avec le programme python ?
Pourquoi cette commande ne fonctionne pas sur le raspberry directement, sans utiliser ma page php ?
La commande "sudo python ...." aurait-elle pu être utilisée sur ma page php si l'utilisateur www-data avait les droits d'exécution sur le logiciel python ou quelque chose du genre ?

Re: [RESOLU] Exécution script python via page web

Posté : dim. 12 nov. 2017 21:13
par jelopo
Bonjour,
Si j'ai bien compris la commande "sudo /var/www/html/test.py" va exécuter mon fichier et celui-ci avec l'en-tête va comprendre que c'est un fichier à exécuter avec le programme python ?
Oui c'est ça, "sudo" dit d’exécuter ce qui suit avec les droits root. Comme tu l'as vu, il faut aussi autoriser l'utilisateur au sudo dans /etc/sudoers pour restreindre les utilisateurs à ne pas faire n'importe quelle commande en tant que root.
Pourquoi cette commande ne fonctionne pas sur le raspberry directement, sans utiliser ma page php ?
La page PHP est fournie par un service web (apache). Apache ne sais pas lancer directement un exécutable, heureusement d'ailleurs tu imagines les dégâts qu'on pourrait faire si on avait accès aux commandes des serveur web !
La commande "sudo python ...." aurait-elle pu être utilisée sur ma page php si l'utilisateur www-data avait les droits d'exécution sur le logiciel python ou quelque chose du genre ?
C'est à essayer d'ajouter /usr/bin/python dans /etc/sudoers. Mais attention au big trou de sécurité, du coup l'utilisateur www-data pourrais lancer tous les scripts Python de la machine.

L'utilisation des droits root doit être mise en place de façon la plus restreinte possible. C'est potentiellement un trou de sécurité. C'est pour cela qu'il est judicieux de ne paramétrer que ce qu'il est nécessaire. Avant d'être parano sur des pirates qui voudraient détenir des informations confidentielles sur nos programmes, (ce qui existe bien sûr), il est déjà bon de se protéger de soit même et de nos propres erreurs car on est certainement la plus grande source de problème de nos systèmes !

A+

Re: [RESOLU] Exécution script python via page web

Posté : dim. 12 nov. 2017 21:28
par nexen
meme si c'est résolu : http://www.framboise314.fr/une-interfac ... rry-pi-12/

François il est comme ducros ;)

Re: [RESOLU] Exécution script python via page web

Posté : dim. 12 nov. 2017 21:37
par dyox
Bonsoir,

Depuis quelque temps déjà, on a plus besoin d'être en root pour interagir avec les gpio donc la commande "exec('/var/www/html/test.py');" devrait fonctionner.

Re: [RESOLU] Exécution script python via page web

Posté : lun. 13 nov. 2017 11:38
par Xorax
Bonjour tout le monde et merci pour vos réponses !


Superbes explications Jeloppo ! Je comprend déjà mieux le monde de linux et les contraintes de sécurité. Merci de ton aide.


[quote="nexen"]meme si c'est résolu : http://www.framboise314.fr/une-interfac ... rry-pi-12/
François il est comme ducros ;)[/quote]

Oui j'avais jeté un œil à cet article mais il est un peu différent de ce que je voulais faire (pas de script python ici).


[quote="dyox"]Bonsoir,
Depuis quelque temps déjà, on a plus besoin d'être en root pour interagir avec les gpio donc la commande "exec('/var/www/html/test.py');" devrait fonctionner.[/quote]

C'est bon à savoir ! Je testerai.