Funcion exec y popen no ejecutan scripts

Iniciado por $francisco, Septiembre 01, 2014, 02:05:05 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 01, 2014, 02:05:05 PM Ultima modificación: Septiembre 01, 2014, 02:35:38 PM por Expermicid
Que tal a todos, como bien digo, no puedo ejecutar ningún script de python a través de php, normalmente las dudas son si le he dado permisos a los archivos, esto ya esta hecho, o si utilizo sudo, esto también, el shebang de python también esta puesto "#! /usr/bin/env python", y el scripts funciona correctamente porque lo ejecuto a trabes de la consola y funciona.

php:

Código: php
<?php
function escribir(){
error_reporting(E_ALL);
/* Añade redirección, por lo que podemos obtener stderr. */
$gestor = popen('sudo python /var/www/enc/archivo.py', 'r');
echo "'$gestor'; " . gettype($gestor) . "\n";
$leer = fread($gestor, 2096);
echo $leer;
pclose($gestor);
}

escribir();
?>


python:

Código: php
#! /usr/bin/env python

f = open("probando.txt","w")
f.write("hola")
f.close()


Cuando ejecuto el código php me muestra lo siguiente:

Código: php
'Resource id #2'; resource


lo he probado casi todo, con exec, shell_exec, pero no me ejecuta de ninguna manera el script.


Si todos "chmod 777 /var/www/*", "chmod 777 /var/www/enc/*", pero nada, sigue sin dejarme.

Por si sirve de algo me di cuenta que al probar me funciona pero quitando le sudo, pero el problema persiste.

Código: php
 $gestor = popen(' python /var/www/enc/archivo.py', 'r');


le corresponde el archivo:

Código: php
#! /usr/bin/env python

f = open("probando.txt","w")
f.write("hola")
f.close()


aquí todo funciona bien, pero realmente el script que quiero que funcione no funciona.

Código: php
$gestor = popen(' sudo python /var/www/enc/power.py', 'r');


Código: php
#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(18,GPIO.OUT)

GPIO.output(18,GPIO.LOW)
time.sleep(3)
GPIO.output(18,GPIO.HIGH)

GPIO.cleanup()


los dos funciona por consola, pero el segundo archivo necesita sudo para funcionar, y parece ser que no puedo hacerlo desde php, ¿alguna manera de solucionarlo?

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Por si sirve de algo me di cuenta que al probar me funciona pero quitando le sudo, pero el problema persiste.

Código: php
 $gestor = popen(' python /var/www/enc/archivo.py', 'r');


le corresponde el archivo:

Código: php
#! /usr/bin/env python

f = open("probando.txt","w")
f.write("hola")
f.close()


aquí todo funciona bien, pero realmente el script que quiero que funcione no funciona.

Código: php
$gestor = popen(' sudo python /var/www/enc/power.py', 'r');


Código: php
#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(18,GPIO.OUT)

GPIO.output(18,GPIO.LOW)
time.sleep(3)
GPIO.output(18,GPIO.HIGH)

GPIO.cleanup()


los dos funciona por consola, pero el segundo archivo necesita sudo para funcionar, y parece ser que no puedo hacerlo desde php, ¿alguna manera de solucionarlo?

no es aconsejable darle permisos de  root al usuario de apache, fijate si hacer un binario o algo... contame que intentas hacer a vewr si te puedo ayudar

 Lo que estoy intentando es hacer encender una bombilla con un relé térmico desde una raspberry pi con raspbian instalado, instale apache2 y php5, pero para mi sorpresa no podía ejecutar ningún comando con la función exec de php que requiriera permisos de el grupo sudo, bueno... esto no lo tengo muy claro, no se si es que se necesita permisos de administrador, o que estén en el grupo sudo... esto no lo entendí bien pero lo logré solucionar.

El caso que después de tanto leer  y leer y trasnochar, mi cabeza ya casi me estallaba, y casi estaba apunto de dejarlo porque ya no sabia que hacer, y vi en una página que decía que había que añadir un usuario en el grupo sudo entonces hice lo siguiente.

1- Escribí en la función exec:

Código: php
exec("whoami",$out);
echo ·$out;


Entonces me muestra el usuario que esta utilizando para ejecutar los comando y me muestra:
Código: php
www-data


Entonces voy a añadirlo a la lista de sudoers:
Código: php
sudo visudo -f /etc/sudoers


Me voy a la linea:
Código: php
includedir /etc/sudoers.d


Y  justo debajo escribo:
Código: php
www-data ALL=(ALL) NOPASSWD: ALL


Pulso control+O y pulso enter y ya esta, php puede utilizar la función exec, popen o cualquier otra y utilizar sudo sin ningún problema.

Gracias de todos modos a todos.

Nice, y aunque se que estas en pruebas NUNCA lo hagas en un servidor de producción :o

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Acepta con humildad y aprecio que en la vida la muerte es inevitable y amarás ésta, adorando la muerte

Si, ahora estoy en prueba, pero ¿podría configurar lo para no todo el mundo pudiera acceder a esta página? algo interesante seria poder crear una red con la raspberry en la salida de tu tarjeta de red, ¿podría conectar la raspberry a un switch y que la raspberry sea el servidor dhcp y crear una red para conectar otros aparatos?

Julio 27, 2015, 01:21:58 PM #8 Ultima modificación: Julio 27, 2015, 01:26:35 PM por mapa_fm
Hola buenas, estaría interesado en saber como hacer para ejecutar un script de python a través de una pagina PHP sin dar permisos de sudoer al usuario www-data, parecido a lo que preguntaba el compañero. En mi caso quiero activar un buzzer remotamente para un sistema de videovigilancia con Raspberry Pi. Y siendo videovigilancia no sería muy seguro ese remedio. Gracias un saludo.

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta te montas un CGI hacia el python es lo mejor y llamas directamente al api que ejecutar desde php mmmm me suena a que querrás algo como el exec y mejor que tengas esas funciones deshabilitadas.... Saludos

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Acepta con humildad y aprecio que en la vida la muerte es inevitable y amarás ésta, adorando la muerte

Prueba así, te dejo una PoC:

Archivo PHP:
Código: php

<?php
echo "Probando...<br>";
$output = shell_exec("/usr/bin/python /var/www/html/test.py");
echo($output);

?>


Archivo Python:
Código: python

#!/usr/bin/env python
f = open("probando.txt","r+")
print f.read()
f.close()


Archivo que se lee:
CitarTodas putas

Ejecución:

Link: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Contacto: @migueljimeno96 -

Hola, ante todo muchas gracias por responder y muchísimas gracias por tanta brevedad. Estoy intentando procesar tu respuesta, es que soy muy muy noob en estos temas, mira te enseño mi pagina php y mi script de python, es que si no me hago un lío intentando hacer como has hecho tu, a ver si con mis códigos quedaría igual.

página php:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

script python:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Julio 27, 2015, 04:31:17 PM #12 Ultima modificación: Julio 27, 2015, 04:35:24 PM por Jimeno
Un problema es que estás llamando a Python con sudo, lo que te pedirá la contraseña, hazlo sin él si es posible o da permisos al usuario para que lo corra sin necesidad de sudo.
Otro problema es que estás llamando a Python directamente, eso podría traerte problemas, hazlo como lo hice yo, es lo que recomiendan en stackoverflow.
Por último creo ver $a- exec, ¿no será $a = exec(loquesea);?

PD: a no ser que encender4 sea una variable que has declarado necesitarás usar $_POST['encender4'] (nota las comillas) para que lo reconozca.
PD2: asegúrate de que ambos archivos tengan permisos suficientes en el directorio en el que están.
Contacto: @migueljimeno96 -

He estado haciendo una a una las variaciones que me has comentado pero no funciona:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

y si le quito el guión de a- exec no sale ni la página php, tiene permisos 755 tanto la página php como el script

y la variable encender no sé no esta declarada, en un tutorial salía así directamente.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
He estado haciendo una a una las variaciones que me has comentado pero no funciona:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

y si le quito el guión de a- exec no sale ni la página php, tiene permisos 755 tanto la página php como el script

y la variable encender no sé no esta declarada, en un tutorial salía así directamente.
Y el signo de igual?
Contacto: @migueljimeno96 -


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Nada, tampoco funciona.

Tienes que ir arreglando cada fallo, jajaja.
Lanza php5 archivo.php y pon la salida aquí.
Sustituye archivo.php por el nombre de tu archivo.
Contacto: @migueljimeno96 -

PHP Notice: Undefined index: encender4 in /var/www/php/alarma.php on line 20

Pon el código PHP al principio del archivo y programa bien ese PHP, anda.
Además no declares cosas en condicionales, es decir, mejor haz:
Código: php

<?php
    // Mejor
    $aux = $_POST['encendido4'];
    if ($aux) {...}

    // Peor
    if ($_POST['encendido4']) {...}

?>


Y por favor, revisa errores de sintaxis y esas cosas antes de comentar.
Además dale permisos correctos al archivo .py y al .php

Te dejo otra prueba con tu código:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
PHP Notice: Undefined index: encender4 in /var/www/php/alarma.php on line 20
Contacto: @migueljimeno96 -

Julio 27, 2015, 08:23:45 PM #19 Ultima modificación: Julio 27, 2015, 08:29:32 PM por mapa_fm
Disculpa cualquier error cometido, es que estoy empezando en esto lo siento. Ahora al ejecutar el comando    php5 alarma.php   en consola, no da ningún error y suena el buzzer. Pero estoy teniendo muchos problemas al intentar agregar la funcionalidad del botón, yo creo que tengo el código tal como me decías, pero me sigue saliendo el mismo error:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Disculpa tanta molestia, en lograr esto ya no te molesto mas. Muchísimas gracias por tu ayuda.