1. 查看一下你的Apache的執行用戶是誰: lsof -i:80 運行之后的結果為:
從圖中我們可以清楚的看到,httpd(也就是Apache)的執行用戶為:exec_shell(注:這是我本機上改過之后的用戶,只是用來說明一下,你的肯定不是這個!)
lsof 就是 List of file 的縮寫,就是列出當前系統打開文件的工具,關於他具體的使用方法可參考:http://club.topsage.com/thread-234763-1-1.html 說的比較不錯
確定了你的Linux上Apache的執行者是誰,下面為了安全起見,新建一個用戶將Apache的執行用戶修改為我們新建的用戶。
2. 新建Apache的執行用戶
useradd your_exec_user 我們知道創建用戶的時候都會默認創建一個用用戶名同樣的用戶組,也就是說現在我們也有一個your_exec_user的用戶組
下面我們修改一下Apache的配置文件,使它的執行用戶改為我們剛才新建的這個用戶your_exec_user :
vi /home/houqingdong/httpd-exe/config/httpd.conf(這個是你的Apache所在的目錄位置)
找到下面的地方,修改為你新建的用戶:your_exec_user
重新啟動Apache: /home/houqingdong/httpd-exe/bin/apachect1 restart -------------> 重啟完之后你可以利用:lsof -i:80 查看一下。
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的目錄
-
#!/bin/bash
-
#Program
-
# This program will execute mkdir: cd $directory ; mkdir $name
-
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
-
export PATH
-
cd $1
-
if [ ! -d $2 ]; then
-
mkdir $2
-
else
-
echo "Already exist..."
-
exit 1
-
fi
功能很簡單,就是進入到$directory 判斷要創建的目錄名是否存在, 然后創建該目錄 。
構造的php執行函數:(部分)
-
if($type=="dir"){
-
$make_dir_command="/usr/bin/sudo /home/houqingdong/myshell/mkdir.sh /$directory/ $name" ;
-
echo $make_dir_command;
-
exec($make_dir_command,$output,$return);
-
-
if($return == 0){
-
echo "<script>alert('Build directory seccuss!');location.href='right.php?id=\"$directory\"';</script>";
-
}else{
-
echo "<script>alert('Build directory err!');history.go(-1);</script>";
-
}
這里順帶提一句:構造的命令里面最好都使用絕對路徑。
5. 在網頁端的執行結果:
提交之后,要過幾秒中才會彈出執行結果的提示信息:
執行成功,在我們的/home/目錄下:
大功告成!