El script PHP no puede ejecutar el script bash. sh: Permiso denegado

14

Estoy tratando de ejecutar un script .sh de PHP, sin embargo, no se está ejecutando.

Verifiqué los registros de errores y recibo el error 'sh: Permiso denegado'. Verifiqué bajo qué usuario php se está ejecutando, y se hace bajo el usuario apache.

Intenté cambiar la propiedad del .sh al usuario de apache, pero no hay resultado.

Al principio pensé que esto se debía a que el script estaba fuera de www / dir, sin embargo, incluso cuando puse el script en el mismo directorio, el error todavía se está dando.

¿Hay alguna solución para esto que no sea agregar el usuario apache a la lista SUDOers?

El script sh funciona bien si lo ejecuto desde masilla usando el comando 'php filename.php'.

Robin Presto
fuente
3
¿Es un script de shell o un archivo PHP? Tu último párrafo no está claro al respecto. Además, ¿estableció permisos de ejecución ( x) en el archivo? ¿Especificó el intérprete de guiones en una línea shebang?
Daniel Beck
Es un script bash que se ejecuta desde PHP. Sí, lo convertí en un ejecutable y especifiqué el intérprete de guiones. Funciona correctamente cuando ejecuto el script PHP desde masilla y se llama al script bash y se ejecuta correctamente. Pero si ejecuto el script php desde el navegador web en su lugar, no puede ejecutar el script bash y hará este error ya que se ejecuta como el usuario apache y no el usuario que uso en masilla.
Robin Presto
1
Tratar chmod 775 yourscript.sh. Eso otorgará r-x(leer y ejecutar) permisos a "Otros" usuarios en ese archivo.
Rhyuk
Lo intenté. Sin suerte. Sin embargo, no puedo saber la razón exacta hasta mañana. No tengo acceso a los registros desde mi ubicación. Me pondré en contacto con ustedes. Gracias por tu ayuda. :)
Robin Presto

Respuestas:

10

Pruebe las siguientes sugerencias:

  • Intente ejecutar debajo del comando de prueba y compruebe si funcionó:
    • php -r "echo exec('whoami');"
  • Asegúrese de que todos los directorios principales y los archivos tengan al menos r-xpermisos de marca:
    • chmod 755 dir; chmod 755 file
  • Asegúrese de que el propietario del archivo sea su usuario de Apache .
    • Intente también agregar una +sbandera (sudo) al archivo (no recomendado):
      • chmod u+s file,
  • Asegúrese de que su PHP no se esté ejecutando en un safe_mode.
  • Asegúrese de que el script esté dentro de su raíz Apache:
    • De lo contrario, mueva el script dentro de él,
    • o agregue ese directorio a su configuración de Apache,
    • o agregue este directorio a su include_path, por ejemplo:
      • php.ini archivo: include_path ".:/usr/local/lib/php:/your/dir"
      • o .htaccessarchivo:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Compruebe si su shell está configurado como válido (por ejemplo /bin/sh) para su usuario de Apache (por ejemplo, verifique con:) finger.
  • Asegúrese de que su php.inino utiliza: disable_functionspara la execfunción
  • Si usa SELinux o lo ha selinux-utilsinstalado (un sistema Linux con seguridad mejorada), verifique getenforce/ setenforceconfigure como se describe en @Tonin answer.

Solución de problemas:

  • Si cambió su archivo php.inio httpd.conf, no olvide reiniciar el servidor web,
  • Consulte su registro de errores de Apache para obtener detalles adicionales.
  • Habilitar en su php.initodo tipo de errores ( display_error, error_reporting, etc.).
kenorb
fuente
1
Ese fue mi problema ... el directorio padre no tenía derechos de ejecución ... ¡funciona ahora! ¡Gracias! :)
Robin Presto
Todavía no tengo suerte :( ¿Alguna sugerencia? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x.27 root root 4096 3 de septiembre 12:31 / drwxrwxrwt.4 root root 4096 sep 3 15:45 / tmp -rwxr-xr-x. 1 root root 24 sep 3 15:39 / tmp / sleep safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy
1
Argh, setenforce lo resolvió. OMG
piratería
12

Tal problema puede depender del sistema operativo que use y de cómo esté configurado. Algunas distribuciones de Linux (principalmente aquellas basadas en RHEL como CentOS o Fedora) vienen con SELinux activado por defecto. Esto se puede verificar y cambiar temporalmente con los siguientes comandos:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

También puede tener una vista más completa de la configuración actual con:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Este cambio puede hacerse permanente editando el /etc/selinux/configarchivo y estableciendo la SELINUXvariable en permissiveo disabled.

Pero, la forma correcta de resolver este tipo de problema , si realmente se encuentra en esta situación, es verificar el /var/log/audit/audit.logarchivo de registro. Contendrá todos los eventos relacionados con las reglas de SELinux. Entonces, probablemente debería darle a su script el contexto correcto, es decir, estar autorizado para ser ejecutado por el usuario apache / php. La comprobación del contexto de seguridad de SELinux se realiza con ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Esto enumera el usuario, el rol y el tipo de cada archivo / directorio. Aquí el httpd_sys_script_exec_ttipo otorga a los archivos en el directorio cgi el permiso para ser ejecutado por httpd. Su script de shell probablemente debería tener el mismo tipo.

También puede alimentar las audit.loglíneas al audit2allowcomando. Le dará los cambios necesarios para hacer feliz a SELinux. Pero, por lo general, los cambios sugeridos deben realizarse en la propia política de SELinux, que no es lo que debe hacer en su caso (aún así, este resultado puede dar alguna pista de lo que está sucediendo).

La siguiente página describe un problema similar y diferentes formas de resolverlo: http://sheltren.com/stop-disabling-selinux

Tonin
fuente
Gracias por la respuesta detallada! Por desgracia, como mencioné, no puedo tener acceso de root hasta mañana. ¡Entonces me pondré en contacto contigo también! :) Y sí, estoy usando CentOS.
Robin Presto
¡Me encantó tu respuesta, muy informativa! Lamentablemente, no elegí el tuyo porque la aplicación estaba desactivada y no era el problema. Aunque aprendí mucho de tu respuesta, así que gracias. Te votaré cuando tenga suficiente reputación :)
Robin Presto
No te preocupes, me alegra saber que aprendiste de mi publicación.
Tonin
Si el problema es forzado, entonces realmente no es obvio qué diablos está pasando. Me salvó el día!
pihentagy
1

Así que llegué aquí después de buscar un problema similar en Google. Pensé dejar caer que el comentario sobre SELinux me señaló en la dirección correcta.

En mi propio caso, estaba usando un script de implementación Git personalizado que usa un comando de shell. El comando funciona bien en BASH pero luego tiene "permiso denegado" y "no es un repositorio" en Git. Esto fue realmente extraño y revisé varias soluciones hasta que me topé con esta respuesta.

root@ls:~# /usr/sbin/setenforce Permissive Resuelto el problema para mí.

Bade Adesemowo
fuente
0

Mi situación es ligeramente diferente, pero Google me trajo aquí, así que pensé en compartir ...

Mi servidor está ejecutando Debian estable e intentando ejecutar un script de shell funcionó una vez, luego los permisos cambiaron automáticamente a 644 y se consiguió el siguiente intento de ejecutar el script Permission denied. Resultó ser un problema del servidor de samba para mí y no noté el patrón hasta ahora.

El permiso QA Strange cambia al guardar el archivo en una partición Samba desde un editor de Windows . No conocía la map archive = noopción incluso después de usar acciones de samba durante una década.

Algo sobre el uso de Notepad ++ en un escritorio de Windows cambiaría los permisos de los archivos de destino a 675 en lugar de 775 como está configurado el umask.

Chris K
fuente
-7

Ejecutar comandos raíz en PHP a través de Apache

Tengo una aplicación web que necesita ejecutar comandos shells como root dentro de una función PHP, y usted pensaría que sería bastante sencillo ... pero me tomó unos pocos google para obtener todos los detalles, así que aquí están mis notas prácticas sobre eso. Esto está en un sistema Linux que ejecuta Apache, y usaremos "sudo" dentro de "shell_exec" para ejecutar los comandos.

Lo principal es editar el archivo / etc / sudoers, y normalmente puede (como root) usar el comando "visudo" para hacerlo.

Asegúrese de que apache pueda ejecutar comandos Y NO requiera una contraseña:

apache  ALL=(ALL)       NOPASSWD: ALL

Entonces necesitas comentar esta línea:

#Defaults    requiretty

Si no lo hace, verá estos errores en / var / log / secure: "lo siento, debe tener un tty para ejecutar sudo". Ahora ya está listo, y el código PHP es simple:

$ resultados = shell_exec ('fecha de sudo');

متعب المغيري
fuente
55
Esta es una idea terrible . Si su instalación de Apache se ve comprometida o la aplicación que está ejecutando lo hace ... su hacker obtiene acceso completo al sistema con demasiada facilidad. Lo correcto es cambiar los permisos en el script, no dejar las cosas abiertas
Journeyman Geek
2
Me siento obligado a emitir un voto negativo en esta respuesta debido a las obvias preocupaciones de seguridad con otorgarle a usuario / rol de apache todos los permisos.
Ramhound
@JourneymanGeek No es "si", es cuando la instalación se ve comprometida.
Michael Hampton