1. 程式人生 > >php利用sudo許可權執行shell指令碼

php利用sudo許可權執行shell指令碼

php作為一門伺服器端指令碼語言,也是可以呼叫系統命令的,這其中就包括了執行shell指令碼


編寫test.sh指令碼如下

#! /bin/sh

mkdir /www/a

很簡單的一個shell指令碼 建立一個資料夾

php指令碼如下

system('/usr/bin/test.sh')

在執行前 首先需要驗證的

1.test.sh指令碼是否具有可執行許可權

2.apache nginx phttp等web伺服器是否有test.sh的許可權

3.由於是同步檔案命令 所以需要確保使用者對要下載的目錄有寫入許可權

4.由於我使用php版本高於5.4,已經刪除了安全模式一說,說一也不存在執行在安全模式下

5.執行的指令碼請使用絕對路徑 這點很重要


但是  實際執行後  我發現輸出了faild  說明指令碼並沒有執行成功  查了下原因  是因為apache使用者不具備某些目錄的執行許可權(沒個使用者有沒個使用者的可執行目錄,你的指令碼需要在該目錄下)   切換目錄屬主容易造成安全問題  在linux下 root使用者是不受此限制的 所以 臨時讓使用者可以切換到root許可權 既可以簡單的規避此類問題  如何操作呢?

首先 檢視你的apache使用者或者nginx php-fpm使用者

可以使用 ps -ef  | grep httpd 命令來檢視  其他同理

經查我的apache使用者為_www使用者

然後 visudo   或者 vim /etc/sudoers 找到

## Allow root to run any commands anywhere

root    ALL=(ALL)       ALL這一行 在下邊追加

_www ALL=(root)  NOPASSWD:ALL

第一列是使用者  第二個是可以切換到的使用者 我這裡寫的是root  如果你想讓隨意切換可以在這裡寫All  第三個是可以執行的指令碼路徑 ALL 表示所有

最後 重啟apache讓使用者重新獲得許可權

修改php指令碼

system('sudo /usr/bin/test.sh')


執行 執行成功~~~