利用php重啓apache進程

問題:
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了。進程

相關文章
相關標籤/搜索