not - shell_exec php ejemplos
Ejecutando un script Bash desde un script PHP (4)
Es un problema simple. Cuando se está ejecutando desde la terminal, está ejecutando el archivo php desde la terminal como usuario privilegiado. Cuando va al php desde su navegador web, el script php se ejecuta como el usuario del servidor web que no tiene permisos para ejecutar archivos en su directorio de inicio. En Ubuntu, el usuario de www-data es el usuario del servidor web Apache. Si está en ubuntu, debe hacer lo siguiente: chown yourusername: www-data / home / testuser / testscript chmod g + x / home / testuser / testscript
lo que hace lo anterior es transferir la propiedad del archivo por parte del usuario y le da al grupo de servidores web la propiedad del archivo. el siguiente comando otorga al grupo permisos ejecutables para el archivo. Ahora, la próxima vez que lo hagas desde el navegador, debería funcionar.
Quiero ejecutar el script Bash presente en el sistema desde un script PHP. Tengo dos guiones presentes en el sistema. Uno de ellos es un script PHP llamado client.php presente en / var / www / html y el otro es un script Bash llamado testscript presente en / home / testuser.
Mi script client.php se parece a
<?php
$message=shell_exec("/home/testuser/testscript 2>&1");
print_r($message);
?>
Mi testcript se ve como
#!/bin/bash
echo "Testscript run succesful"
Cuando hago lo siguiente en la terminal
php client.php
Obtengo la siguiente salida en la terminal
Testscript run successful
Pero cuando abro la página en
http://serverdomain/client.php
Obtengo la siguiente salida
sh: /home/testuser/testscript: Permission denied
Recibo este error incluso después de hacer chmod + x testscript.
¿Cómo hago para que funcione desde el navegador? Por favor ayuda.
Estuve luchando con este problema exacto durante tres días. Había establecido permisos en el script para 755. Había estado llamando a mi script de la siguiente manera.
<?php
$outcome = shell_exec(''/tmp/clearUp.sh'');
echo $outcome;
?>
Mi script fue el siguiente.
#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} /;
No obtuve resultados ni comentarios. El cambio que hice para ejecutar el script fue agregar un cd a tmp dentro del script:
#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} /;
Esto fue más por suerte que por juicio, pero ahora está funcionando perfectamente. Espero que esto ayude.
Sin realmente conocer la complejidad de la configuración, me gusta la ruta sudo. En primer lugar, debe configurar sudo para permitir que su servidor web sudo ejecute el comando dado como root. Luego, debe tener la secuencia de comandos para que el servidor web shell_exec''s (testscript) ejecute el comando con sudo.
Para una caja de Debian con Apache y sudo:
Configure sudo:
Como root, ejecute lo siguiente para editar un archivo de configuración nuevo / dedicado para sudo:
visudo -f /etc/sudoers.d/Webserver
(o lo que sea que quiera llamar a su archivo en
/etc/sudoers.d/
)Agregue lo siguiente al archivo:
www-data ALL = (root) NOPASSWD: <executable_file_path>
donde
<executable_file_path>
es el comando que necesita para poder ejecutar como root con la ruta completa en su nombre (digamos/bin/chown
para el ejecutable chown ). Si el ejecutable se ejecutará con los mismos argumentos cada vez, puede agregar sus argumentos justo después del nombre del archivo ejecutable para restringir aún más su uso.Por ejemplo, supongamos que siempre queremos copiar el mismo archivo en el directorio / root /, escribiremos lo siguiente:
www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
Modificar el script (testcript):
Edite su secuencia de comandos de modo que
sudo
aparezca antes del comando que requiere privilegios desudo /bin/chown ...
(digamossudo /bin/chown ...
osudo /bin/cp /root/test1 /root/test2
). Asegúrese de que los argumentos especificados en el archivo de configuración de sudo coincidan exactamente con los argumentos utilizados con el ejecutable en este archivo. Entonces, para nuestro ejemplo anterior, tendríamos lo siguiente en el guión:sudo /bin/cp /root/test1 /root/test2
Si aún recibe permiso denegado, el archivo de script y sus permisos de directorios principales pueden no permitir que el servidor web ejecute el script en sí. Por lo tanto, debe mover la secuencia de comandos a un directorio más apropiado y / o cambiar la secuencia de comandos y los permisos del directorio principal para permitir la ejecución por www-data (usuario o grupo), que está más allá del alcance de este tutorial.
Tenga en cuenta:
Al configurar sudo, el objetivo es permitir el comando en su forma más restringida. Por ejemplo, en lugar de permitir el uso general del comando cp , solo permite el comando cp si los argumentos son, por ejemplo, / root / test1 / root / test2 . Esto significa que los argumentos de cp (y la funcionalidad de cp no se pueden modificar).
Tendría un directorio en algún lugar llamado scripts en la carpeta WWW para que no sea accesible desde la web, pero es accesible por PHP.
eg /var/www/scripts/testscript
Asegúrese de que el usuario / grupo para su testscript
sea el mismo que sus archivos web. Por ejemplo, si su client.php
es propiedad de apache:apache
, cambie el script bash al mismo usuario / grupo usando chown
. Puede averiguar qué propiedad tienen sus archivos client.php
y web haciendo ls -al
.
Entonces corre
<?php
$message=shell_exec("/var/www/scripts/testscript 2>&1");
print_r($message);
?>
EDITAR:
Si realmente desea ejecutar un archivo como raíz desde un servidor web, puede probar este contenedor binario a continuación. Vea esta solución para la misma cosa que desea hacer.