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')
執行 執行成功~~~