2011-11-20 8 views
5

Necesito ejecutar algunos comandos en mi servidor web con php configurado con apache.¿Por qué el comando php `exec (" service apache2 restart ");` no funciona en ubuntu?

exec("service apache2 restart", $output); 
print_r($output); 

de salida:

Array (
    [0] => * Restarting web server apache2 
    [1] => Action 'start' failed. 
    [2] => The Apache error log may have more information. 
    [3] => ...fail! 
) 

Mi conjetura es que es debido a los permisos de PHP en mi ubuntu! ¿Qué sugieres?

+4

Si lo ejecuta a través de la web como 'http: // localhost/restartserver.php', se ejecutará como el usuario' www-data'. De forma predeterminada, el usuario de www-data no tiene permiso para reiniciar el servidor web. – joar

+6

Lo que estás tratando de hacer es generalmente una mala idea. – PeeHaa

Respuesta

6

necesita ejecutar:

visudo 

compruebe que tiene una línea como

Host_Alias LOCAL=192.168.0.1 

con su propio IP local en la parte superior del archivo, a continuación, añadir una línea

www-data  LOCAL=NOPASSWD:/usr/bin/service 

Y el último en su archivo PHP:

exec("/usr/bin/sudo /usr/bin/service apache2 restart"); 

(Está intentando reiniciar apache por web, ¿quizás no conoce la interfaz webmin? Creo que hay mejores soluciones que esta sudo manera. No es bueno autorizar a www-data a detener, iniciar (...) todos los servicios. Mejor explicar por qué desea reiniciar apache;))

+0

¡Gracias por su método de trabajo! ¡eso es lo que necesitaba! Solo estoy haciendo esto para prueba, no es un proyecto real. – EBAG

+0

De nada. –

+0

¿Funcionará esto con otros servicios como named? ¿Puedes explicarme qué hacen exactamente estas líneas? –

1

¿Miraste el registro de errores de Apache como dice? ¿Que hay ahi?

Casi con seguridad su script PHP se está ejecutando sin permisos suficientes para reiniciar Apache. Lo cual es probablemente lo mejor. Si realmente necesita que esto funcione, considere hacer un script raíz setuid para invocar desde PHP (tenga en cuenta que esto no debe usarse en producción, y probablemente creará un agujero de seguridad).

También podría escribir un pequeño servicio que se ejecuta como root y acepta comandos para reiniciar Apache desde su script PHP. Esa sería una forma más "adecuada" de hacerlo, aunque la tarea que nos ocupa parece incorrecta, así que no estoy seguro de que deba continuar por este camino.

2

Los servicios (en el sentido de los servicios del sistema, como Apache httpd) solo pueden ser manipulados (iniciados, suspendidos, reiniciados) por el usuario raíz (UID 0).

O se ejecute el script PHP en el contexto de la raíz (idea mala ) o usar algo como sudo para ejecutar los comandos como superusuario. Dicho esto, hay implicaciones de seguridad muy serias cuando se ejecutan programas con privilegios de superusuario, ¡especialmente si no desinfecta sus entradas correctamente!

Cuestiones relacionadas