Centos PHP+Apache執行exec()等Linux腳本權限設置的詳細步驟

1. 查看一下你的Apache的執行用戶是誰: lsof -i:80         運行以後的結果爲:php

   

從圖中咱們能夠清楚的看到,httpd(也就是Apache)的執行用戶爲:exec_shell(注:這是我本機上改過以後的用戶,只是用來講明一下,你的確定不是這個!)  html

lsof 就是 List of file 的縮寫,就是列出當前系統打開文件的工具,關於他具體的使用方法可參考:http://club.topsage.com/thread-234763-1-1.html   說的比較不錯shell

肯定了你的Linux上Apache的執行者是誰,下面爲了安全起見,新建一個用戶將Apache的執行用戶修改成咱們新建的用戶。apache

2. 新建Apache的執行用戶安全

    useradd your_exec_user  咱們知道建立用戶的時候都會默認建立一個用用戶名一樣的用戶組,也就是說如今咱們也有一個your_exec_user的用戶組bash

    下面咱們修改一下Apache的配置文件,使它的執行用戶改成咱們剛纔新建的這個用戶your_exec_user :函數

     vi  /home/houqingdong/httpd-exe/config/httpd.conf(這個是你的Apache所在的目錄位置)工具

    找到下面的地方,修改成你新建的用戶:your_exec_userui

    

   從新啓動Apache:   /home/houqingdong/httpd-exe/bin/apachect1  restart              -------------> 重啓完以後你能夠利用:lsof -i:80 查看一下。spa

3. 執行visudo(或者是 vi /etc/sudoers) , 爲your_exec_user賦予root權限,而且不須要密碼,還有一步重要的修改(我被困擾的就是這個地方)

    visudo    找到這個地方,添加your_exec_user,而且設置無需密碼

    

   我以前的時候,作完這裏就去執行php腳本去了,結果一直建立不成功,並且很鬱悶的是我切換到your_exec_user用戶下直接執行是能夠執行成功的。

   後來,查看了一下Apache的日誌文件,發現:

   

      這裏明顯看出,在執行sudo的時候說必需要有一個tty去運行sudo , 知道問題出在哪裏問題就好解決了: vi /etc/sudoers   將下面的這句註釋掉:      

      這是由於默認的狀況下,執行sudo須要一個終端,這裏註釋掉就能夠了。接下來,寫你的shell腳本和php命令吧

4. 這裏貼一下我寫的很簡單的一個腳本,就是利用在php端傳來的$directory和$name,在該目錄下建立一個$name的目錄

   

  1. #!/bin/bash  

  2. #Program  

  3. #     This program will execute mkdir: cd $directory ; mkdir $name  

  4. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin  

  5. export PATH  

  6. cd $1  

  7. if [ ! -d $2 ]; then  

  8.     mkdir $2  

  9. else  

  10.     echo "Already exist..."  

  11.     exit 1  

  12. fi  


功能很簡單,就是進入到$directory   判斷要建立的目錄名是否存在,  而後建立該目錄 。

構造的php執行函數:(部分)

  1. if($type=="dir"){  

  2.           $make_dir_command="/usr/bin/sudo /home/houqingdong/myshell/mkdir.sh /$directory/ $name" ;  

  3.           echo $make_dir_command;  

  4.           exec($make_dir_command,$output,$return);  

  5.   

  6.               if($return == 0){  

  7.                   echo "<script>alert('Build directory seccuss!');location.href='right.php?id=\"$directory\"';</script>";  

  8.               }else{  

  9.                   echo "<script>alert('Build directory err!');history.go(-1);</script>";  

  10.               }  

這裏順帶提一句:構造的命令裏面最好都使用絕對路徑。

5. 在網頁端的執行結果:

    

提交以後,要過幾秒中才會彈出執行結果的提示信息:

     執行成功,在咱們的/home/目錄下:

大功告成!

相關文章
相關標籤/搜索