問題:
php
經過php重啓apache能夠把apache的控制放到web頁面上。
可是因爲php自己的運行模式,通常而言,除非apache具有root權限,不然php連/etc都訪問不了,更不用說反過來控制apache了。
所以,咱們須要找到別的方法。web
思路:
apache
經過system,exec等方法,PHP能夠呼出一些權限以內的命令,或者執行一些可執行的程序。
所以咱們能夠實現編譯一個重啓apache的可執行程序,並賦予其root權限,而後讓php調用該程序來實現apache的重啓動。ui
具體方法:spa
首先咱們創建sample.c文件,並進行編譯: rest
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main(int argc, char **argv) { pid_t pid; uid_t uid,euid; uid=getuid(); euid=geteuid(); setreuid(euid,uid); //交換uid和euid,臨時轉讓文件自己的root權限給PHP(apache)。 if ((pid = fork()) == 0) //生成子進程 { if ((pid = fork()) > 0) //子進程下繼續生成孫進程 { exit(0); //殺掉子進程 } else if (pid == 0) { sleep(2); //因爲子進程已死,所以孫進程成爲孤兒進程,並自動由init進程領養,。 //此時孫進程發送消息給apache,請求其重啓。 system("apachectl -k restart"); exit(0); } } else if (pid > 0) //程序最初的父進程在這裏回收子進程。 waitpid(pid, NULL, 0); return 0; }
編譯完該文件以後,咱們須要對執行文件的權限進行一下處理 code
chmod u+s sample
sample是由root創建,root編譯,所以本來也只能由root執行調用。
但經過上面這個命令,其餘用戶也能夠調用這個文件了。
而後咱們在PHP中調用這個文件就能夠重啓apache了。進程