今天晚上:19:30分,這個困擾了我好久的問題終於解決,其中的原理也終於弄清楚了,總之是利用sudo來賦予apache的使用者root的執行許可權,下面記錄一下:
利用php利用root許可權執行shell指令碼必須進行以下幾個步驟:(所有步驟都是我親自實驗,若有不妥可指出,謝謝!)
1. 確定一下你的apache的執行使用者是誰。注:不一定就是nobody,我自行安裝的httpd,我的apache的使用者就是daemon
2. 利用visudo為你的apache執行使用者賦予root執行許可權,當然還有設定無密碼。注:為了安全起見,這裡最好是新建乙個使用者,讓他作為apache的執行使用者即可(修改httpd.conf檔案,後面我會指出)
3. 這步就簡單了,編寫你的指令碼,利用php的exec,system...函式來執行。
接下來就是詳細的實現過程:
1. 檢視一下你的apache的執行使用者是誰: lsof -i:80 執行之後的結果為:
從圖中我們可以清楚的看到,httpd(也就是apache)的執行使用者為:exec_shell(注:這是我本機上改過之後的使用者,只是用來說明一下,你的肯定不是這個!)
lsof 就是 list of file 的縮寫,就是列出當前系統開啟檔案的工具,關於他具體的使用方法可參考: 說的比較不錯
確定了你的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的目錄
[plain]view plain
copy
#!/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執行函式:(部分)
[php]view plain
copy
if($type
=="dir"
)else
這裡順帶提一句:構造的命令裡面最好都使用絕對路徑。
5. 在網頁端的執行結果:
提交之後,要過幾秒中才會彈出執行結果的提示資訊:
執行成功,在我們的/home/目錄下:
哈哈。。。大功告成!(謝謝存哥的幫助指點!)
php 利用root 許可權執行shell指令碼
也可以指定某個shell檔案不需要密碼 www data all all nopasswd var www html filesystem build.sh 1 新增使用者 adduser admin 新增使用者到root使用者組 adduser admin root 2 授予admin的sudo ...
PHP執行root命令
在玩c 以前 玩過一段時間的php,哪個時候需要用php 來執行root命令,一直未果,直到有一天搜尋到了super這個外掛程式.隨著玩c的日子多了.發現可以用c語言來包裹 要執行的外部命令.實驗了一下.成功了.不需要任何外部工具就可以實現用php 執行root命令.我下面就把方法發布給大家,有需求...
Manjaro設定開機以root許可權執行自定義指令碼
背景 前段時間把筆記本搞成雙網絡卡,同時上內外網,每次開機都要手動設定路由,十分不方便,所以就考慮開機自動設定,但是設定route需要su許可權,所以記錄一下實現方法 sudo pacman sy systemd rc local sudo systemctl enable rc local.ser...