Ejecutando un script Bash desde un script PHP

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

&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.

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.

Ejecutar comandos raíz a través de PHP

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:

  1. 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:  

      donde 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 
  2. Modificar el script (testcript):

    Edite su secuencia de comandos de modo que sudo aparezca antes del comando que requiere privilegios de sudo /bin/chown ... (digamos sudo /bin/chown ... o sudo /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 scope de este tutorial.

Tenga en cuenta:

Al configurar sudo, el objective 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).

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.

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.