Permiso php shell_exec () en Linux Ubuntu

13

Estoy desarrollando una aplicación php usando un servidor Linux. Mi problema es ejecutar shell_exec()para llamar a algún archivo exe que no funciona (en realidad no es exe, es una especie de archivo ejecutable de Linux)

echo shell_exec("whoami");

Tengo demonio

echo shell_exec("ls")

Tengo un nombre de archivo pero

echo shell_exec("php -v")

No tengo nada, una página en blanco

echo shell_exec("php ....bla bla bla")

una página en blanco también

Todos estos comandos si escribo en la terminal (usuario hu) funcionarán. He buscado en google por varias horas, la gente dice eso por permiso. No tengo experiencia en Linux. ¿Qué debo hacer para ejecutar mi programa en php?

ngoaho91
fuente

Respuestas:

10

El usuario de Apache www-datanecesita privilegios para ejecutar ciertas aplicaciones usando sudo.

  1. Ejecutar el comando sudo visudo. En realidad, queremos editar el archivo en etc/sudoers. Para hacerlo, mediante el uso sudo visudoen la terminal, se duplica el sudoersarchivo (temp) para editar.
  2. Al final del archivo, agregue el siguiente ejemplo: -si queremos usar el comando para restartfumar y el phpcomando para otra acción en su pregunta,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Esto supone que desea ejecutar restarty phpcomandos usando privilegios de superusuario (root). Y usa el phpcomando en la usr/bin/ruta)

Sin embargo, si desea ejecutar todas las aplicaciones con privilegios de superusuario, agregue lo siguiente en lugar de lo anterior. Es posible que no desee hacer eso, no para ALLcomandos, muy peligroso.

www-data ALL=NOPASSWD: ALL

3. Después de editar el archivo sudoers ( visudoeditamos el archivo temporal de sudoersmodo que guarde y salga del archivo temporal (visudo) para escribir en el sudoersarchivo. wq!)

4. Eso es todo, ahora use exec()o shell_execde la siguiente manera dentro de su xxx.phpscript. recuerde usar sudoantes de usar el comando en el script php.

ex:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

o

shell_exec("sudo php -v"); 

Entonces, en su problema, agregue los comandos que desea utilizar en el step no (2.)mientras agrego y cambie su script php como lo desee.

Aquí está el mismo problema que el suyo /programming//a/22953339/1862107

Así, Sumanadasa
fuente
Esta pregunta no se trata de usar sudo.
tricasse
Esto está muy mal redactado
Barney Chambers
5

Intente especificar la ruta completa al binario php. Por ejemplo, /usr/bin/php

Si no lo sabes, encuéntralo usando: which php

Keiran Holloway
fuente
echo shell_exec ("/ usr / bin / php -v"); no funciona
ngoaho91
cuando dices "no funciona", ¿qué obtienes? Es decir, ¿algún error? ¿Algo en sus registros de error de php / apache? Si la página está en blanco, ¿ver fuente le da algo con qué trabajar? Lamentablemente, el término "no funciona" no nos da nada con qué trabajar ...
Keiran Holloway
@ ngoaho91: normalmente los registros son /var/log/httpd/error*.
slm
: D Tengo una página en blanco, nada que ver. ¿Dónde está el archivo de registro de error php / apache?
ngoaho91
@ ngoaho91: ¿qué distribución de Linux es esta? CentOS, Ubuntu?
slm
4

En general, usted desea especificar rutas completas para aplicaciones tales como whoami, ls, y php. Si no está seguro de cuál es la ubicación de un programa (ruta completa), puede averiguarlo así:

$ type php
php is /usr/bin/php

Luego, especifíquelo así en su secuencia de comandos.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>
slm
fuente
Ejecuto tu comando. escriba php => php es / usr / bin / php. pero el comando de ruta completa todavía me devuelve una página en blanco.
ngoaho91
¿Qué pasa si haces esto echo shell_exec("/usr/bin/php somefile.php 2>&1")?
slm
echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: error de reubicación: / usr / bin / php: símbolo X509_free, versión OPENSSL_1.0.0 no definida en el archivo libcrypto. so.0.0.0 con referencia de tiempo de enlace
ngoaho91
OK, el servidor web (Apache) normalmente se ejecuta como otro usuario, no hu. Así que hay que asegurarse de que el guión phpse intenta ejecutar está establecido así: chmod 755 somescript.php. Esto permitirá que el usuario con el que se ejecuta Apache pueda ejecutar y leer su .phparchivo.
slm
1
@ ngoaho91: todo debería estar bien ahora, ese error me dice que hay algo mal con tu configuración de Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
slm
2

¿Tu php.ini restringe el conjunto de comandos disponibles?

Esto es de mi /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
X Tian
fuente
no, mi ini igual que la tuya
ngoaho91
2

Cómo depurar problemas de shell_exec

OK, aquí tenemos un problema: algo funciona en la terminal y no funciona en shell_exec de php (o exec, spawn, lo que sea). Pensemos: ¿cuál es la diferencia entre You y php? Aquí hay tres:

PHP se ejecuta desde las reglas del servidor HTTP

De hecho, su terminal se ejecuta desde el yournameusuario y se ejecuta php desde www-data. Entonces, la primera idea es abrir la terminal del www-datausuario e intentar el mismo comando. Entonces....

  • Abra el /etc/passwdarchivo, busque la línea con el www-datausuario y cambie su shell de inicio de sesión (último) de /bin/false(o lo que sea) a /bin/bash.
  • Abrir www-dataterminal:su www-data
  • Pruebe php -v o lo que no pueda ejecutar desde php. Si no funciona, verá buenos registros y podrá depurar el problema.
  • No te olvides de reparar el /etc/passwdarchivo mientras estás listo

PHP se ejecuta desde PHP .

PHP es paranoico enogh y hay muchas opciones en la configuración de apache / nginx y php.ini que pueden romper su intento.

Esto es un poco más complicado de depurar. Aquí hay dos opciones:

  • Habilite los registros en el navegador y vea el problema. Edite su php.ini, encienda display_errorsy todos los demás indicadores para ver errores en el navegador. Pueden leerlos y depurarlos.

  • Obtenga www-datael shell (vea la primera sección) y ejecute algo como

echo '<?php shell_exec("php -v"); ?>' | php

que ejecutará el mismo código php en la consola y podrás ver errores y depurar.

PHP se ejecuta desde SELinux / apparmor

Selinux y apparmor son elementos de seguridad que prohíben a las aplicaciones realizar acciones específicas (por ejemplo, generar otras aplicaciones o algunas otras aplicaciones específicas). Tal vez está habilitado en su servidor.

Para verificar, deshabilite selinux / apparmor y verifique si existe un problema.

Para arreglarlo, lea el manual apropiado y arregle las reglas permisivas para su caso.

Arenim
fuente
0

Para mí, la forma más simple era entrar al php.ini y comentar la línea que comienza con

disable_functions
Alex
fuente