[RESOLU] Un programme Python ne fonctionnant plus quand appelé d'une page php

Pour discuter boîtiers, fixation, radiateurs, écrans LCD, water cooling... Enfin, tout ce que vous ne trouvez pas dans les autres rubriques !

Modérateur : Francois

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

[RESOLU] Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » sam. 26 mai 2018 23:44

Bonsoir.

Bien qu'il semble s'agir d'un problème soft, je poste tout de même ici, car c'est aussi en relation avec l'utilisation d'un sensehat. Je m'explique.

Sur un serveur nginx, tourne une page php dont voici le code :

Code : Tout sélectionner

<?php
        $output = exec('python indexPhpAccessed.py');
        echo $output;
?>
Le script php appelé est codé comme suit :

Code : Tout sélectionner

#! /usr/bin/env python
print ('Script ended')
A ce stade, tout est fonctionnel : l'accès à la page web affiche bien "Script ended".

Seulement voilà, le script python est sensé piloter un sensehat, à l'aide d'une librairie dédiée. Le script suivant est fonctionnel, lancé d'un shell.

Code : Tout sélectionner

#! /usr/bin/env python
import sys
from sense_hat import SenseHat

sense = SenseHat()
sense.show_message("index.php has been accessed", scroll_speed=0.02, text_colour=[255,0,0], back_colour=[0,50,0])

sense.clear()
print ('Script ended')
Par contre, il ne fonctionne plus s'il est appelé de la page php. La page php n'affiche même plus "Script ended", car l'exécution du script python interrompt à la ligne

Code : Tout sélectionner

sense = SenseHat()
J'ai creusé du côté des droits, mais sans succès.
Et là, c'est le drame... je ne sais plus quoi tenter.

Des idées ?
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » sam. 26 mai 2018 23:54

Sur les droits, quelque chose m’échappe.
Que le propriétaire du script python soit pi, www-data ou root, la commande "python fichier.py" fonctionne.
Que le propriétaire du fichier php soit pi, www-data ou root, la page est accessible.

:shock:
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » dim. 27 mai 2018 01:02

Avant d'aller dormir, illumination : n'y aurait-il pas un message d'erreur dans la sortie stderr ?
J'ai donc redirigé la sortie d'erreur vers la sortie standard à l'appel du script python par la page php :

Code : Tout sélectionner

$output = exec('python indexPhpAccessed.py 2>&1');
Message d'erreur :

Code : Tout sélectionner

OSError : [Errno 13] Permission denied: '/var/www']
Je ne comprend pas ce que /var/www vient faire dans l'histoire (/var/www n'existe même pas), mais c'est déjà une piste !
En utilisant shell_exec et non exec, j'ai la stack entière... mais on verra demain !
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » dim. 27 mai 2018 02:15

A l'aide de la commande suivante,

Code : Tout sélectionner

print posix_getpwuid(posix_geteuid())['name'];
J'ai vérifié que la page php était bien exécutée sous le user www-data.

En utilisant

Code : Tout sélectionner

print "Env thinks the user is [%s]" % (os.getlogin());
print "Effective user is [%s]" % (getpass.getuser());
le user utilisé est bien celui que je pense quand je lance le script python "à la main".

Mais quand le script est lancé par la page php, j'obtiens une "OSError : [Errno 25] Inappropriate ioctl for device".

Cette fois, j'abandonne vraiement pour ce soir :lol: !
Cordialement,

Vague Nerd

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par jelopo » dim. 27 mai 2018 09:10

Bonjour,

Je pense qu'il faut se focaliser plutôt sur l'erreur "OSError : [Errno 13] Permission denied: '/var/www']" car à mon avis l'erreur générée ensuite est due à un problème de format dans les commandes ajoutées ensuite.

Théoriquement, c'est bien www-data qui lance le serveur httpd. Par défaut la home directory de ce user est /var/www (à vérifier dans le fichier /etc/passwd),

Il faudrait essayer de lancer le script en manuel avec le user www-data pour voir.

Essayer de créer un répertoire /var/www appartenant à www-data ou modifier sa home directory vers un autre répertoire.

A+

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » dim. 27 mai 2018 12:15

Bonjour et merci de ton aide.
jelopo a écrit :
dim. 27 mai 2018 09:10
Je pense qu'il faut se focaliser plutôt sur l'erreur "OSError : [Errno 13] Permission denied: '/var/www']" car à mon avis l'erreur générée ensuite est due à un problème de format dans les commandes ajoutées ensuite.
+1, mais pourquoi "plutôt" ? C'est bien sur ça que je creuse...
jelopo a écrit :
dim. 27 mai 2018 09:10
Théoriquement, c'est bien www-data qui lance le serveur httpd.
Je crois l'avoir vérifié en demandant à php de m'imprimer le user courant (voir post ci dessus).
De même, j'ai essayé de demander à python de me répondre à la question (toujours voir post ci dessus), et là, il se passe quelque chose que je ne comprend pas.
Si le lance le script avec un utilisateur quelconque, python me retourne bien le user que je pense. Par contre, quand c'est php qui lance le script, j'ai une erreur 25 "inappropriate ioctl for device" (sur os.getlogin()).
jelopo a écrit :
dim. 27 mai 2018 09:10
Par défaut la home directory de ce user est /var/www (à vérifier dans le fichier /etc/passwd),
Haaaaaa, je comprend mieux (je ne comprenais déjà pas très bien ce que /var/www venait faire la dedant), je vais vérifier.
EDIT : bingo ! /var/www est bien la home de www-data. Merci, une question de moins !
jelopo a écrit :
dim. 27 mai 2018 09:10
Essayer de créer un répertoire /var/www appartenant à www-data [...]
J'ai fais ça cette nuit. Il m'a fallu créer plein de sous répertoire ensuite, pour finalement buter sur la création du fichier à ranger dans l'arbo créée.
J'ai bien sûr changé le propriétaire des répertoires en question...
De toute évidence, ce n'est pas un soucis php/nginx mais plutôt python dans le contexte.
jelopo a écrit :
dim. 27 mai 2018 09:10
[...] modifier sa home directory [de www-data] vers un autre répertoire.
Il faudrait essayer de lancer le script en manuel avec le user www-data pour voir.
Oui, merci, bonnes idées.

A+
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » dim. 27 mai 2018 12:28

EDIT : bingo ! /var/www est bien la home de www-data. Merci, une question de moins !
Oui, mais du coup, pourquoi le propriétaire était root ?
Le script python est bien exécuté par www-data (j'ai viré le os.getLogin(), et l'effective user est bien www-data (getpass.getuser())).
Et pourquoi,dans ces conditions, le script python n'est pas capable de créer quelque chose dans un répertoire dont le user est le propriétaire ?

EDIT : ok erreur de débutant fatigué. J'avais inversé les propriétaires groupe et user.
Plus de problème dans /var/www.
Par contre, maintenant, même soucis de droit d'accès sur /dev/fb1.
Cet homme est au fond du trou et commence à creuser.
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » dim. 27 mai 2018 14:07

Bon. Reprenons calmement.

J'ai rétablis les droits sur /var/www, viré tout le contenu, relancé le tout (nginx, puis accès au php qui appelle le script python) et ça roule sur ce point (toute l'arbo dans /var/www se crée sans souis).
ls -las me donne

Code : Tout sélectionner

0 crw-rw---T  1 root video    29,   1 janv.  1  1970 fb1
sur /dev/fb1. Je ne suis donc pas surpris que www-data n'ai pas le droit de jouer avec.

Mais pourquoi le script python fonctionne-t-il lancé avec le user de base ? Pourquoi a-t-il accès au framebuffer et non www-data ?
(j'ai changé le propriétaire à www-data/www-data et mon test marche désormais, mais la question reste posée).
Cordialement,

Vague Nerd

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par jelopo » lun. 28 mai 2018 09:01

Bonjour,

Le fichier fb1 appartient au group video, peut être suffit-il d'ajouter le group video au user www-data ?

Code : Tout sélectionner

sudo usermod -aG video www-data
+ redémarrer les processus du user www-data pour recharger leurs environnements.

Pour vérifier l'affectation aux groupes

Code : Tout sélectionner

id www-data
A+

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Un programme Python ne fonctionnant plus quand appelé d'une page php

Message par vague nerd » mer. 30 mai 2018 00:19

jelopo a écrit :
lun. 28 mai 2018 09:01
Bonjour,

Le fichier fb1 appartient au group video, peut être suffit-il d'ajouter le group video au user www-data ?

Code : Tout sélectionner

sudo usermod -aG video www-data
+ redémarrer les processus du user www-data pour recharger leurs environnements.

Pour vérifier l'affectation aux groupes

Code : Tout sélectionner

id www-data
A+
Re merci pour votre aide.

Je doute que cela fonctionne car de mémoire le user de base n'est pas dans le groupe video (je dois vérifier ce point demain, et j'espère me tromper !).
ls -las me donne

Code : Tout sélectionner

0 crw-rw---T  1 root video    29,   1 janv.  1  1970 fb1
sur /dev/fb1. Je ne suis donc pas surpris que www-data n'ai pas le droit de jouer avec.
Mais pourquoi le script python fonctionne-t-il lancé avec le user de base ? Pourquoi a-t-il accès au framebuffer et non www-data ?
(j'ai changé le propriétaire à www-data/www-data et mon test marche désormais, mais la question reste posée).
Une piste : le user de base dont je parle est finalement un sudoer (il n'est donc pas un user si "de base" finalement !).
Pour des raisons évidentes, j'espère ne pas devoir mettre www-data dans la liste des sudoers, mais je vais quand même tester l'hypothèse (en le limitant la possibilité à l'exécution du script particulier, vu que ça semble possible).

Suite au prochain numéro, j'espère demain...

EDIT : au fait, pour ceux que ça intéresse, ATTENTION, il ne faut PAS jouer avec les droits de trucs dans /dev/ ! Je ne le fait ici (posts précédents) qu'a titre d’expérimentation, pour essayer de comprendre ce qui se passe !
Cordialement,

Vague Nerd

Répondre

Retourner vers « Les accessoires du Raspberry Pi »