perché il command php `exec (" service apache2 restart ");` non funziona su ubuntu?

Ho bisogno di eseguire alcuni comandi sul mio server web con php configurato con apache.

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

produzione:

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

La mia ipotesi è che è a causa delle autorizzazioni di php sul mio ubuntu! Che cosa suggerisci?

È necessario eseguire:

 visudo 

controlla di avere una linea come

 Host_Alias LOCAL=192.168.0.1 

con il tuo IP locale nella parte superiore del file, quindi aggiungi una linea

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

E ultimo nel tuo file PHP:

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

(Stai cercando di riavviare Apache via web, forse non conosci l'interface webmin ? Penso che ci siano soluzioni migliori di questo modo sudo. Non è una buona cosa autorizzare i dati di www a fermarsi, iniziare (…) tutto servizi. Spiega meglio il motivo per cui desideri riavviare apache;))

I servizi (nel senso di servizi di sistema, come Apache httpd) possono essere manipolati (avviati, fermati, riavviati) solo dall'utente root (UID 0).

O esegui lo script PHP nel context di root ( ctriggers idea) o usi qualcosa come sudo per eseguire i comandi come superutente. Detto questo, ci sono implicazioni di sicurezza molto serie quando si eseguono programmi con privilegi di super utente, specialmente se non si disinfettano correttamente gli input!

Hai guardato il registro degli errori di Apache come dice? Cosa c'è lì dentro?

Quasi sicuramente lo script PHP è in esecuzione senza autorizzazioni sufficienti per riavviare Apache. Quale è probabilmente per il meglio. Se davvero hai bisogno che funzioni, prendi in considerazione l'idea di creare uno script setuid root da invocare da PHP (nota che questo non dovrebbe essere usato in produzione, e probabilmente creerà un buco di sicurezza).

Potresti anche scrivere un piccolo servizio che funziona come root e accetta i comandi per riavviare Apache dal tuo script PHP. Sarebbe un modo più "corretto" per farlo, anche se il task a portta di mano sembra improprio, quindi non sono sicuro che dovresti continuare su questa strada.