mic78000
Posts: 52
Joined: Tue Dec 24, 2013 8:07 am

Exécuter un python par le web

Sun Jan 19, 2014 9:02 am

Bonjour,
J'ai un script python dans /usr/lib/cgi-bin (un simple helloword).

Code: Select all

#!/usr/bin/env python
print "Content-type: text/html\n\n"
print "<h1>Hello World</h1>"
Si je lance dans la console

Code: Select all

/usr/lib/cgi-bin/hello.py
il se lance bien; j'ai le hello word dans la console.
Si je le lance par le web

Code: Select all

http://adresse ip/hello.py
il télécharge le fichier .py au lieu de l'exécuter. Que faire pour que ça s'exécute au lieu de se télécharger ?

Les droits d'accès de mon fichier "hello.py" sont à 755 ainsi que ceux du dossier cgi-bin
Le serveur web utilisé est lighttpd
Conformément à ce qui est écrit dans la page d'accueil de lighttpd, j'ai fait un

Code: Select all

lighty-enable-mod cgi
Dans /etc/lighttpd/conf-available/10-cgi.conf j'ai (et là, j'avoue ne pas tout comprendre):

Code: Select all

 /usr/share/doc/lighttpd/cgi.txt

server.modules += ( "mod_cgi" )

$HTTP["url"] =~ "^/cgi-bin/" {
        cgi.assign = ( "" => "" )
}

## Warning this represents a security risk, as it allow to execute any file
## with a .pl/.py even outside of /usr/lib/cgi-bin.
#
cgi.assign      = (
#       ".pl"  => "/usr/bin/perl",
        ".py"  => "/usr/bin/python",
)

# Ajoute par moi :

$HTTP["url"] =~ "^/cgi-bin/" {
        cgi.assign = ( ".py" => "/usr/bin/python" )
}
Dans sudo visudo
j'ai ajouté pour voir, sans trop comprendre (si quelqu'un peut me dire s'il faut le laisser et sans doute remplacer /usr/lib/cgi-bin;hello.py par ALL...)

Code: Select all

www-data ALL=(root) NOPASSWD: /usr/lib/cgi-bin/hello.py

vohu
Posts: 92
Joined: Tue Aug 14, 2012 9:22 am

Re: Exécuter un python par le web

Sun Jan 19, 2014 7:59 pm

ton fichier python est exécutable ?

chmod fichier.py +x

mic78000
Posts: 52
Joined: Tue Dec 24, 2013 8:07 am

Re: Exécuter un python par le web

Sun Jan 19, 2014 9:50 pm

Oui, tout à fait.

Ceci dit, je viens de réaliser qu'en fait il lance un hello.py que j'avais en double dans www-data. J'ai donc effacé ce dernier mais maintenant j'ai une erreur 404 (fichier non trouvé) alors qu'il y a un hello.py dans /usr/lib/cgi-bin.
Grrr si j'ai un fichier "hello.py" dans /usr/lib/cgi-bin on le lance bien par cette adresse : http://adresse ip /hello.py non ?

JumpZero
Posts: 1128
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Exécuter un python par le web

Mon Jan 20, 2014 7:54 pm

Bonsoir,

adresse ip/cgi-bin/script
chez moi avec lighttpd
--
Jmp0

mic78000
Posts: 52
Joined: Tue Dec 24, 2013 8:07 am

Re: Exécuter un python par le web

Mon Jan 20, 2014 8:04 pm

Grrr j'ai donc essayé http://192.168.1.43/cgi-bin/hello.py et idem : 404 not found
Bon déjà, ça me rassure que quelqu'un a réussi à le faire. Tu as suivi un tutorial ou quelque chose dont je puisse m'inspirer ?
Tu as les mêmes choses dans les fichiers config que j'ai donné dans mon message d'origine ?


jelopo
Posts: 1601
Joined: Wed Oct 17, 2012 7:53 pm

Re: Exécuter un python par le web

Mon Jan 20, 2014 10:10 pm

Bonjour,

Chez moi ça fonctionne du premier coup.
Par contre dans la conf par défaut de lighttpd j'ai ceci :

Code: Select all

server.document-root        = "/var/www"
donc sur mon rpi ton script cgi-bin python est dans /var/www/cgi-bin.

Sinon après modification de la conf tu as bien rechargé lighttpd ?

Code: Select all

sudo service lighttpd stop
sudo service lighttpd start
Edit :
Pour accéder au repertoire /usr/lib/cgi-bin, il faut ajouter une directive en fin de /etc/lighttpd/lighttpd.conf

Code: Select all

alias.url = ( "/cgi-bin/" => "/usr/lib/cgi-bin/" )


A+

mic78000
Posts: 52
Joined: Tue Dec 24, 2013 8:07 am

Re: Exécuter un python par le web

Mon Jan 20, 2014 10:37 pm

Merci pour vos réponses !

Alors, en me servant du lien http://uniteng.com/index.php/2013/03/11 ... -lighttpd/, j'ai pu voir qu'il fallait ajouter ,"py" dans le fichier lighttpd.conf dans la ligne

Code: Select all

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi",".py" )
Et là, ça marche !
En fait, ça marche si je met le cgi dans var/www/cgi-bin ou dans var/www
mais pas si je le mets dans /usr/lib/cgi-bin
Bon, cela dit, les py dans un sous dossier de www, pourquoi pas.
Sinon, pour répondre aux autres messages : je faisait bien redémarrer le serveur web après les modifs du fichier conf et j'ai bien server.document-root = "/var/www" dans le fichier conf.

Merci à tous !

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Exécuter un python par le web

Mon Jan 20, 2014 11:18 pm

J'imagine que le but ca sera de commander les relais de ton autre post (maintenant que tu sais que "l'amperage" :mrgreen: est ok) , donc d'utiliser les GPIO donc il faudra lancer le script python avec les privileges admin "root" (un sudo en fait) du coup faut faire ca : http://www.mobilewill.us/2012/07/raspbe ... sions.html , sinon le RPI te demandera le pass root sur sa console mais comme tu seras a distance (ou meme sans ecran sur le RPI) tu t'en apercevras pas et tu vas te demander pourquoi ca marche pas :oops:
c'est ce que tu avais fait la sans trop comprendre mais faudra le bon nom de dossier :
mic78000 wrote:Bonjour,
...
Dans sudo visudo
j'ai ajouté pour voir, sans trop comprendre (si quelqu'un peut me dire s'il faut le laisser et sans doute remplacer /usr/lib/cgi-bin;hello.py par ALL...)

Code: Select all

www-data ALL=(root) NOPASSWD: /usr/lib/cgi-bin/hello.py

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Fri Mar 13, 2015 9:20 pm

Bonjour à tous.

J'ai moi aussi un soucis d’exécution mais chez moi, rien à faire...
J'ai installé lighttpd, fait tout ce qui est indiqué dans ce post mais il n'y a rien à faire.
Il se passe une chose étrange:

J'ai mis 2 scripts python dans /var/www/cgi-bin/
- hello.py (un bête hello qui s'imprime 100 fois à l'écran)
- blink.py, un script sensé faire clignoter une led sur le port gpio avec wiringpi2

Lorsque je lance le script hello dans mon navigateur ça marche:
si j'entre 192.168.0.49/cgi-bin/hello.py dans mon anvigateur, il m'affiche 100 fois le mot hello.

Lorsque ke lance le script blink.py, celui-ci ne se lance pas, il m'est proposé en téléchargement par le navigateur.
Si je le lance directement dans mon terminal ssh, ma led clignote comme je le souhaite, le script fonctionne donc.

Dans le terminal ssh, sudo /var/www/cgi-bin/blink.py fonctionne parfaitement et fait clignoter la led.

Les fichiers ont les même droits, appartiennent au même groupe et ont le même propriétaire.
J'ai mis les droits au max pour mes essais, histoire d'être sur que ça ne vient pas de là.
J'ai peut-être fait des regroupements ou des changements au niveau des groupes/utilisateurs mais j'ai tellement fait de manip que je ne m'en sort plus... (je débute)

Je DESESPERE, j'ai passé la journée la dessus et je ne sais plus quoi faire...

Voici ce que ça donne pour les droits:

pi@raspberrypi /var/www/cgi-bin $ ls -a -l
total 16
drwxrwxrwx 2 www-data www-data 4096 mars 13 21:13 .
drwxrwxrwx 5 www-data www-data 4096 mars 13 21:43 ..
-rwxrwxrwx 1 root www-data 473 mars 13 20:44 blink.py
-rwxrwxrwx 1 root www-data 246 mars 13 19:44 hello.py
pi@raspberrypi /var/www/cgi-bin $

==========================
Mon fichier blink.py:

#! /usr/bin/python
#

import wiringpi2 as wiringpi
from time import sleep
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(24, 1) # sets GPIO 24 to output
i = 1
while i<=20:
wiringpi.digitalWrite(24, 0) # sets port 24 to 0 (0V, off)
sleep(0.05) # wait 10s
wiringpi.digitalWrite(24, 1) # sets port 24 to 1 (3V3, on)
sleep(0.05) # wait 5s
i = i + 1
wiringpi.digitalWrite(24, 0) # sets port 24 to 0 (0V, off)

======================
mon fichier hello.py:

#! /usr/bin/python
#
print "Content-Type: text/html\n\n"
print '<html><head><meta content="text/html; charset=UTF-8" />'
print '<title>Raspberry Pi</title><p>'
for count in range(1,100):
print 'Hello&nbsp;World... '
print "</p></body></html>"

JumpZero
Posts: 1128
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Exécuter un python par le web

Sat Mar 14, 2015 12:44 pm

Bjr,

intéressant!...
Je pense, mais tu vas le vérifier, que le problème viens du fait que le programme blink.py fait des écritures sur un gpio. Ceci ne peux que être fait par le super-utilisateur (user = root). C’est un choix de design du Raspberry Pi: seul root a le droit d’écrire sur les gpio’s. Mais il y a des contournements possibles (expliqués + bas). Sous lighty (i.e. lighttpd) les scripts cgi sont exécutés par l'utilisateur www-data. Donc ton script hello.py est ok mais le blink.py doit se terminer pas une erreur car non exécuté par root. Donc lighty le télé-charge car il ne s'exécute pas correctement. Enfin cette dernière étape je n’en suis pas vraiment sur, je ne maîtrise pas assez lighty.
Enfin pour vérifier cette théorie essaies comme tu l’as déjà fait dans un terminal ssh de lancer la commande:
/var/www/cgi-bin/blink.py
sans le sudo. Il devrait y avoir une erreur et la led ne clignote pas.
Alors que ça marche avec le sudo. Donc ça marche pour root seulement.
Si c’est le cas je vois deux solutions. La première la plus simple et la plus propre consiste a rendre les gpio’s accessibles a tous les utilisateurs. C’est possible avec la bibliothèque de wiringpi et ça tombe bien c’est celle que tu utilises. De mémoire (je ne l’utilise pas) il y a une façon de mettre les gpio’s dans l’espace utilisateur. Voir le site de Gordon (l’auteur) ou la doc. La deuxième moins propre c’est d'utiliser le sticky bit. Sous Unix un programme s'exécute avec les droits de l’utilisateur qui le lance. Logique. Avec le sticky bit il s'exécute avec les droits du propriétaire. Donc user www-data peut lancer un programme qui s'exécute avec les droits root si root est le propriétaire (owner) du fichier et que le sticky bit est actif. Alors bien sur c’est sale, car un immense trou de sécurité. Un programme mal écrit, un utilisateur malveillant, et le système lui appartient. Donc choisi plutôt la première solution. La deuxième pour tests seulement, surtout si ton serveur web est accessible depuis internet. Enfin je te laisse googler ‘sticky bit’.
Si toute cette théorie est fausse ça peut aussi être un problème de path. Les bibliothèques auxquelles blink.py veut accéder ne sont pas accessibles, elles ne sont pas dans son path.
Essaies un echo $PATH dans le script hello.py (enfin l'équivalent python de cette commande bash) et compare avec un sudo echo $PATH depuis un terminal ssh. Pour voir les différences de path les users www-data et de root. C’est une autre piste…
Tiens nous au courant.
--
Jmp0

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Sat Mar 14, 2015 3:51 pm

Merci beaucoup pour ta réponse, je me sens beaucoup moins seul devant mon rasp ;)

J'avais bien essayé de faire un /var/www/cgi-bin/blink.py et j'ai effectivement cette erreur qui me suggère d'ajouter un sudo en debut de ligne:

pi@raspberrypi ~ $ /var/www/cgi-bin/blink.py
wiringPiSetup: Must be root. (Did you forget sudo?)

Il me semblait avoir lu quelque chose à ce sujet, une manip qui consistait à regrouper l'utilisateur www-data et root (en quelque sorte, fusionner les groupes www-data et root pour que www-data soit considéré comme root au moment de l'écriture sur le gpio) mais je ne suis plus sur que c'était pour contourner ce problème précis.

Bref, je confirme qu'un /var/www/cgi-bin/blink.py ne fonctionne pas mais que sudo /var/www/cgi-bin/blink.py fonctionne parfaitement.

J'ai jeté un oeil à la doc de wiringpi mais je n'ai rien trouvé pour résoudre mon problème.

PS n°1:
Pour info, j'avais trouvé une piste qui indiquait comment modifier les droits utilisateur d'un script précis par la commande sudo visudo pour autoriser ce scripts à s'éxécuter sans avoir besoin de taper le mot de passe sudo lors de son appel.
C'est en effet ce qui provoque (je pense) l'erreur actuelle et qui fait que mon script blink ne s'exécute pas.
J'ai donc entré ces deux lignes à la fin du fichier après avoir fait un sudo visudo:
www-data ALL=(root) NOPASSWD:/var/cgi-bin/blink.py
www-data ALL=(root) NOPASSWD:/var/cgi-bin/hello.py
Mais ça ne fonctionne pas non plus.
Peut être un problème de syntaxe ?

PS n°2:
L'accès au GPIO via le language PHP fonctionne sur mon serveur lighttpd.
Le python n'a pas encore accès au gpio de mon raspberry mais ça avance...

Ce petit bout de code ci-dessous allume bien la led branchée sur la broche 5 lorsque la page est appelée dans le navigateur (elle est à la racine du serveur):
Si ça peut aider quelqu'un.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.$
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test GPIO</title>
</head>
<body>
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
echo "Allume led<br>";
echo system('/usr/local/bin/gpio mode 5 out');
echo system('/usr/local/bin/gpio write 5 1');
?>
</body>
</html>

Dans mon cas, le python me semble indispensable car je voudrais mettre au point une alarme et j'ai besoin de surveiller quelques entrées gpio et d'en commander d'autres en sortie en fonction des entrées (sirène ou lampe flash sur relais)
J'ai vu des choses à propos des interruptions mais je n'y connais pas grand chose.
Il me semble que wiringpi permet de déclencher des actions sur interruption.
Le python aussi ?

Merci de m'éclairer un peu sur ce point, quels choix technique faire pour surveiller le gpio et déclencher des actions sur le gpio sans trop consommer de ressources et permettre à ma centrale d'alarme d'afficher les infos correspondantes (via le php ? ) avec le serveur web ?

jelopo
Posts: 1601
Joined: Wed Oct 17, 2012 7:53 pm

Re: Exécuter un python par le web

Sat Mar 14, 2015 9:41 pm

Bonjour,

Une piste peut être ici : http://www.pautex.fr/domotique/raspberrypi.php

A+

JumpZero
Posts: 1128
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Exécuter un python par le web

Sun Mar 15, 2015 4:24 am

Bjr,
le lien que te donne jelopo correspond exactement a ton problème: commander les gpio’s sans être root. Il existe d’autre bibliothèques Python qui le font aussi : http://abyz.co.uk/rpi/pigpio/python.html
et aussi https://pypi.python.org/pypi/RPi.GPIO
Je n’arrive pas a retrouver (pas assez de temps) mais wiringpi le fait aussi, mais peut-être juste pour les commandes bash pas le module Python, pas sur…
Ce que tu fais avec visudo c’est éditer le fichier sudoers et autoriser le user www-data a avoir les droits root en utilisant sudo. Mais quand lighty lance un script cgi il le lance comme user www-data sans sudo. Donc ça ne résout rien. Par contre une piste tu peux faire un wrapper: un script shell qui lance ton script python. Par ex un fichier blink_wrapper.sh
#!/bin/bash
sudo /chemin…./blink.py
A tester, lighty appel ce script, qui appel le script Python avec sudo
Peut être encore plus simple puisque tu dis que ces lignes
echo system('/usr/local/bin/gpio mode 5 out');
echo system('/usr/local/bin/gpio write 5 1');
dans la page du serveur fonctionnent tu peux aussi le faire depuis Python voir le module subprocess de Python.
--
Jmp0

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Wed Mar 18, 2015 5:21 pm

[quote="jelopo"]Bonjour,

Une piste peut être ici : http://www.pautex.fr/domotique/raspberrypi.php

A+[/quote]

Malheureusement le lien vers quick2wire inclus dans le post ci-dessus est mort.
Le code n'est apparemment plus accessible.
J'ai jeté un oeil au 'subprocess' de python mais alors là je suis complètement largué. Ca parle de C est je ne sais pas par quel bout prendre ce truc...
Appréhender toutes ces nouvelles notions de programmation et d'architecture du rasp en même temps c'est assez ardu !
Je ne sais pas toujours par quoi commencer tellement il y a de trucs à apprendre et à maitriser !

Bon je vais tenter de tester cette histoire de wrapper pour voir si je m'en sort...
(edit quelques longues minutes plus tard...)
Bon j'ai tenté cette histoire de wrapper et ça ne fonctionne pas.
Je me trompe quelque part ?

J'ai créé un fichier allume_led.php que j'ai placé dans la racine du serveur lighttpd. (/var/www)
Ce fichier contient:
<?php
exec ( "sudo /var/www/cgi-bin/blink_wrapper.sh" );
?>

J'ai créé un fichier blink_wrapper.sh dans le dossier cgi-bin contenant ces deux lignes:
#!/bin/bash
sudo /var/www/cgi-bin/blink.py

J'ai autorisé l'execution du fichier par la commande:
sudo chmod +x blink_wrapper.sh

Lorsque je lance la page allume_led.php dans mon navigateur il ne se passe rien.
La led reste éteinte :-(

(un sudo python blink.py dans le terminal fait bien clignoter la led, le script est executé avec un sudo directement sur le raspberry)

Je peux essayer autre chose ?
On doit bien pouvoir y arriver non ?

================================================
Ça a quand même du bon car je suis tombé la dessus: [url]http://hardware-libre.fr/2013/07/ajoute ... #comment-8[/url]

Apparemment le module python RPi.GPIO permet grâce à une de ses fonctions d'attendre une transition sur le GPIO.
Dans l'exemple ci dessus c'est un passage à 0 qui déclenche une action.
Le gros plus c'est que d'après l'auteur du post ça ne consomme pas du tout de ressources tant que c'est en attente de transition sur la broche.
Dans le cadre de mon système d'alarme, ça paraît être la bonne solution pour le coeur du système qui sera écrit en python et qui va tourner en permanence pour scruter les entrées du gpio sur lesquelles seront branchés mes capteurs !

jelopo
Posts: 1601
Joined: Wed Oct 17, 2012 7:53 pm

Re: Exécuter un python par le web

Wed Mar 18, 2015 9:56 pm

Bonjour,

Quand tu lance la commande "sudo" dans un terminal, c'est bien avec le user propriétaire de l'instance lighttpd (www-data) ?
Car c'est ce user qui lancera la commande lorsque tu passera par un navigateur.

As-tu ajouté cette ligne dans /etc/sudoers ?

Code: Select all

www-data ALL=(root) NOPASSWD: /var/www/cgi-bin/blink_wrapper.sh 
N.B. 1: Du coup le sudo dans blink_wrapper.sh ne sert plus puisque c'est déjà sous l'environement de root que sera lancé le .py.

N.B.2 : Je te conseille de mettre des commandes "echo" dans les bash et des commandes "print" dans les .py et de rediriger les sorties vers un fichier de log, pour suivre à quel moment ça plante. Au moins le temps du débug....

A+

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Thu Mar 19, 2015 7:55 am

Quand tu lance la commande "sudo" dans un terminal, c'est bien avec le user propriétaire de l'instance lighttpd (www-data) ?
La commande sudo est lancée depuis un terminal sous ssh, je pense donc être sous l'utilisateur pi non ?
J'avoue ne pas trop comprendre le sens de ta question.

Autre chose: J'ai essayé d'ajouter la ligne d'autorisation d'execution sans password pour le .sh dans le fichier sudoer mais ça ne change rien.
J'ai aussi retiré le sudo dans le fichier php (led_clignote.php) au cas où, puisqu'il est devenu inutile mais rien à faire.

Sinon voici ma démarche pour essayer de comprendre ce qui ne va pas:

Pour tracer l'execution de blink.py, j'ai rajouté ça à la fin du script:

Code: Select all

mon_fichier = open("log.txt", "w")                      
mon_fichier.write("Fichier blink bien execute")
mon_fichier.close()
Donci mon script s’exécute, ça crée un fichier témoin blink.txt
C'est ce que tu me suggérais pour m'assurer que les scripts fonctionnent ?

J'ai aussi rajouté deux echo au script blink_wrapper.sh et aussitôt lancé celui-ci dans le terminal pour vérifier ce qui se passe. (en entrant directement la commande: ./blink_wrapper.sh)
La led clignote et mes deux echo tracent bien l’exécution du script et, TRES IMPORTANT: le script blink.py est bien appelé car il crée le fichier blink.txt !
Voilà ce que ça donne dans le terminal:

pi@raspberrypi /var/www/cgi-bin $ ./blink_wrapper.sh
DEBUT execution wrapper blink.py
FIN execution wrapper blink.py
pi@raspberrypi /var/www/cgi-bin $


Un petit LS me permet de vérifier que le fichier blink.txt a bien été créé et que par conséquent le wrapper arrive bien à appeler le fichier blink.py à partir de la ligne de commande:

pi@raspberrypi /var/www/cgi-bin $ ls
blink.py blink_wrapper.sh hello.py log.txt
pi@raspberrypi /var/www/cgi-bin $

J'efface ensuite mon petit fichier blink.txt et je vais lancer la page led_clignote.php dans mon navigateur.
led_clignote.php contient ce code:

Code: Select all

<?php
exec ( "/var/www/cgi-bin/blink_wrapper.sh" );
echo (" Execution page php terminee");
?>
La led ne clignote pas et le fichier blink.txt n'est pas créé mais le message "Execution page php terminee" s'affiche bien dans le navigateur.

Bon, je fais de gros progrés en python, batch et compagnie et c'est génial mais ça ne veut toujours pas fonctionner.

C'est lié à cette histoire d"utilisateur www-data dont ut me parlais et que je n'arrive pas à saisir ?

Encore merci.

PS: Je constate un truc à l'instant, led_clignote.php appartient à l'utilisateur pi et le repertoire cgi-bin à www-data.
Il n'y aurait pas un truc bizarre là dedans ?

-rw-r--r-- 1 pi pi 98 mars 19 08:40 led_clignote.php
drwxrwxrwx 2 www-data www-data 4096 mars 19 09:20 cgi-bin

tarznek
Posts: 1
Joined: Thu Mar 19, 2015 12:33 pm

Re: Exécuter un python par le web

Thu Mar 19, 2015 12:37 pm

Salut ,

j'ai exactement le même problème que toi dans cette galère !
Ce que je ne comprends pas meme en mettant l'utilisateur 'pi' ou 'www-data' dans le groupe ROOT , ce dernier n'en tiens pas compte ... Cela veut-il dire que dans la bibiliotheque que j'utilise dans mon cas Rpi il est codé en dur "Root" et rien d'autre pour activer les GPIO ?

jelopo
Posts: 1601
Joined: Wed Oct 17, 2012 7:53 pm

Re: Exécuter un python par le web

Thu Mar 19, 2015 6:51 pm

Bonjour,

Ce que je veux dire, c'est que ce n'est pas l'utilisateur "pi" qui lance la commande, mais l'utilisateur "www-data".
Lighttpd est lancé avec cet utilisateur, donc tous les scripts cgi-bin qui sont exécuté lorsque l'on navigue sur le site web héberge par le Raspberry sont lancé par cet utilisateur.

Pour vérifier, il faut passer cette commande :
[code]
$ ps -aef | grep lighttpd
[b]www-data[/b] 2311 1 0 mars17 ? 00:02:26 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
[/code]

Il faut donc que cet utilisateur ai le droit de lancer les commandes "sudo", sans mot de passe.

Pour faire un essai, tu peux te connecter en ssh , passer sous le compte "root" en faisant "su - " par exemple, puis du compte root te connecter sur ce compte "www-data" en faisant "su - www-data". Alors là tu pourras lancer ton script, et voir effectivement si www-data a bien le droit de l'executer.

Comme ceci :
[code]
pi@raspberry ~ $ su -
Mot de passe :
root@rpi:~# su - www-data
$
[/code]

En espérant avoir été plus clair.

A+

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Mon Mar 23, 2015 6:52 pm

Bon, j'ai réussi à faire ce que tu m'as indiqué.
Lorsque je lance le programme blink.py sous l'utilisateur www-data j'ai bien une erreur.
Apparemment, elle se situe à la ligne 4, ci dessous l'erreur en question:


$ ./blink.py
./blink.py: 2: ./blink.py: import: not found
from: can't read /var/mail/time
./blink.py: 4: ./blink.py: Syntax error: Bad function name
$


Et voici les premières lignes de mon fichier blink.py:

Code: Select all

#! /usr/bin/env python
#

import wiringpi2 as wiringpi
from time import sleep
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(24, 1)      # sets GPIO 24 to output  
Ca serait donc l'instruction from time import sleep qui pose problème ???

jelopo
Posts: 1601
Joined: Wed Oct 17, 2012 7:53 pm

Re: Exécuter un python par le web

Tue Mar 24, 2015 9:35 pm

Bonjour,

Il fait une erreur sur from comme si ton script était un bash et non un script python.
Je me dit qu'il n'a pas reconnu ta première ligne
#! /usr/bin/env python
Essaies de supprimer l'espace après le point d'exclamation.

Sinon, charge l'environement python directement
#!/usr/bin/python

A+

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Thu Mar 26, 2015 7:57 am

Merci pour ton aide.

Décidément ça ne veut pas fonctionner.
J'ai tenté de supprimer l'espace comme tu me l'as indiqué mais ça ne fonctionne pas.
#!/usr/bin/dev python

Ensuite j'ai essayé ça:
#! /usr/bin/python

Puis la même chose sans espace:
#!/usr/bin/python

Rien à faire, j'ai toujours la même erreur:
root@raspberrypi:~# su - www-data
$ ./blink.py
./blink.py: 2: ./blink.py: import: not found
from: can't read /var/mail/time
./blink.py: 4: ./blink.py: Syntax error: Bad function name


Mon rasp a reçu un mauvais sort ? :roll:
===========================================
by tarznek » Thu Mar 19, 2015 12:37 pm
Salut ,

j'ai exactement le même problème que toi dans cette galère !
Et pour toi tarznek, ça donne quoi ?

JumpZero
Posts: 1128
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Exécuter un python par le web

Thu Mar 26, 2015 11:38 am

Bjr,
et le même script marchait pour le user pi, non?
Peut-être que www-data et pi non pas le même path.
Fait un echo $PATH en tant user pi et compare avec la meme chose en user www-data.
Si ce n'est pas le meme modifie le path du user www-data.
PATH=$PATH:/un/premier/path/a/ajouter/:/un/deuxieme/:etc
--
Jmp0

pascalou
Posts: 9
Joined: Fri Jan 16, 2015 7:38 am

Re: Exécuter un python par le web

Thu Mar 26, 2015 12:05 pm

Salut,

Effectivement je n'ai pas le même path.
pour pi:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

pour www-data:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


Sous l'utilisateur www-data j'ai fait ce que tu m'as dit, www-data a le même PATH que pi à présent.
Malheureusement ça ne fonctionne toujours pas.

http://192.168.0.49/cgi-bin/blink.py dans le navigateur me propose toujours le téléchargement et n'exécute pas le fichier.

JumpZero
Posts: 1128
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Exécuter un python par le web

Fri Mar 27, 2015 4:55 am

Bjr,

C'est bizarre avec ces erreurs on dirait que c'est bash qui interprète blink.py et non pas python.
le "shebang" c'est a dire la sequence #! ne semble pas la première ligne du fichier, une ligne vide avant? si oui supprime, pas sur que ça soit ça mais ça peut pas faire de mal.
Tu confirmes que sous le user pi le programme blink.py fonctionne comme attendu?
Essaies de faire un bête programme python qui affiche un texte quelconque et lance le sous le user www-data pour voir si cet user peut exécuter du code python.
--
Jmp0

Return to “Français”