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:
<?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:
#! /usr/bin/env python
f = open("probando.txt","w")
f.write("hola")
f.close()
Cuando ejecuto el código php me muestra lo siguiente:
'Resource id #2'; resource
lo he probado casi todo, con exec, shell_exec, pero no me ejecuta de ninguna manera el script.
Los archivos tienen permisos?
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.
$gestor = popen(' python /var/www/enc/archivo.py', 'r');
le corresponde el archivo:
#! /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.
$gestor = popen(' sudo python /var/www/enc/power.py', 'r');
#! /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.
$gestor = popen(' python /var/www/enc/archivo.py', 'r');
le corresponde el archivo:
#! /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.
$gestor = popen(' sudo python /var/www/enc/power.py', 'r');
#! /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:
exec("whoami",$out);
echo ·$out;
Entonces me muestra el usuario que esta utilizando para ejecutar los comando y me muestra:
www-data
Entonces voy a añadirlo a la lista de sudoers:
sudo visudo -f /etc/sudoers
Me voy a la linea:
includedir /etc/sudoers.d
Y justo debajo escribo:
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
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?
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.
@mapa_fm (https://underc0de.org/foro/index.php?action=profile;u=48864) 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
Prueba así, te dejo una PoC:
Archivo PHP:
<?php
echo "Probando...<br>";
$output = shell_exec("/usr/bin/python /var/www/html/test.py");
echo($output);
?>
Archivo Python:
#!/usr/bin/env python
f = open("probando.txt","r+")
print f.read()
f.close()
Archivo que se lee:
CitarTodas putas
Ejecución:
(http://i.imgur.com/QEqPcQZ.png)
Link: http://i.imgur.com/QEqPcQZ.png
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:
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xft1/v/t1.0-9/11781846_10205344741071239_8309099979255199373_n.jpg?oh=a62edef55d06bdd747c3fd00e6c77fcf&oe=56481A7F
script python:
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xat1/v/t1.0-9/11781606_10205344744271319_2344580044460271564_n.jpg?oh=acd4b0276d7bf5845e9db45f5ed71bf4&oe=5658CC66
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.
He estado haciendo una a una las variaciones que me has comentado pero no funciona:
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/11800169_10205345168521925_2953870105127239639_n.jpg?oh=92884c49b49867113f23cbbc7356fcaf&oe=565CB7C5
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xfp1/v/t1.0-9/18388_10205345170481974_8147685789098473032_n.jpg?oh=9d8489811f27ce34ebec176d1ca374ba&oe=5648D559
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:
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xaf1/v/t1.0-9/11800169_10205345168521925_2953870105127239639_n.jpg?oh=92884c49b49867113f23cbbc7356fcaf&oe=565CB7C5
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xfp1/v/t1.0-9/18388_10205345170481974_8147685789098473032_n.jpg?oh=9d8489811f27ce34ebec176d1ca374ba&oe=5648D559
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?
Nada, tampoco funciona.
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.
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:
<?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:
(http://i.imgur.com/l2bzZ9s.png)
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
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:
https://scontent-mad1-1.xx.fbcdn.net/hphotos-xft1/v/t1.0-9/13727_10205345773697054_5003085043448104083_n.jpg?oh=00e93eb612751644b9ab11a3644bffc6&oe=56409D83
Disculpa tanta molestia, en lograr esto ya no te molesto mas. Muchísimas gracias por tu ayuda.