El usuario de Apache www-data
necesita privilegios para ejecutar ciertas aplicaciones usando sudo
.
- Ejecutar el comando
sudo visudo
. En realidad, queremos editar el archivo en etc/sudoers
. Para hacerlo, mediante el uso sudo visudo
en la terminal, se duplica el sudoers
archivo (temp) para editar.
- Al final del archivo, agregue el siguiente ejemplo: -si queremos usar el comando para
restart
fumar y el php
comando para otra acción en su pregunta,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php
(Esto supone que desea ejecutar restart
y php
comandos usando privilegios de superusuario (root). Y usa el php
comando 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 ALL
comandos, muy peligroso.
www-data ALL=NOPASSWD: ALL
3. Después de editar el archivo sudoers ( visudo
editamos el archivo temporal de sudoers
modo que guarde y salga del archivo temporal (visudo) para escribir en el sudoers
archivo. wq!
)
4. Eso es todo, ahora use exec()
o shell_exec
de la siguiente manera dentro de su xxx.php
script. recuerde usar sudo
antes 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
Intente especificar la ruta completa al binario php. Por ejemplo,
/usr/bin/php
Si no lo sabes, encuéntralo usando:
which php
fuente
/var/log/httpd/error*
.En general, usted desea especificar rutas completas para aplicaciones tales como
whoami
,ls
, yphp
. Si no está seguro de cuál es la ubicación de un programa (ruta completa), puede averiguarlo así:Luego, especifíquelo así en su secuencia de comandos.
fuente
echo shell_exec("/usr/bin/php somefile.php 2>&1")
?hu
. Así que hay que asegurarse de que el guiónphp
se 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.php
archivo.¿Tu php.ini restringe el conjunto de comandos disponibles?
Esto es de mi
/etc/php5/php.ini
fuente
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
yourname
usuario y se ejecuta php desdewww-data
. Entonces, la primera idea es abrir la terminal delwww-data
usuario e intentar el mismo comando. Entonces..../etc/passwd
archivo, busque la línea con elwww-data
usuario y cambie su shell de inicio de sesión (último) de/bin/false
(o lo que sea) a/bin/bash
.www-data
terminal:su www-data
/etc/passwd
archivo mientras estás listoPHP 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
, enciendadisplay_errors
y todos los demás indicadores para ver errores en el navegador. Pueden leerlos y depurarlos.Obtenga
www-data
el shell (vea la primera sección) y ejecute algo comoecho '<?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.
fuente
Para mí, la forma más simple era entrar al php.ini y comentar la línea que comienza con
fuente