PS.這幾天用PHP寫了一個小工具,因爲要部署在Linux,又要暫時使用sudo執行一些Shell命令,網上也有很多資料,但是有的要麼就直接把Web服務器用戶直接提升權限,要麼就使用密碼存文件方式,安全性都不是特別好,好在搜索到在Wordpress上一位外國友人的文章,很實用,安全性也不錯,就把它翻譯過來和大家分享一下,下面是正文部分。
許多時候我們需要在Linux系統上執行系統命令--比如來刪除一個目錄或者重啓服務。但是,因爲Apache並不是以root權限運行的,這樣使用PHP的exec()、system()或者passthru()函數來實現以上功能就變得不太可能。
解決這個問題的方案是非常簡單的,特別是在Ubuntu上。Apache的用戶www-data需要獲得權限來使用sudo執行一些應用。
1、執行命令
command sudo visudo
2、在文件末尾,增加如下內容
www-data ALL=NOPASSWD: /sbin/iptables, /usr/bin/du
假設你希望使用超級用戶(root)權限運行iptables和du命令。但是,如果你想使用超級用戶權限運行每一個應用,添加以下命令來代替上面的命令。
www-data ALL=NOPASSWD: ALL
3、就是這樣,現在像下面這種方式在你的php腳本中使用exec()函數
exec("sudo iptables -P FORWARD ACCEPT");
這使我能夠在服務器上執行腳本,這個腳本我早先不得不使用setuid和聯合是否爲cron的方式。但是現在,PHP使這變得方便。PS.
1、修改sudoers還有另外一種方式,使用 vi /etc/sudoers,在此之前要 sudo chmod u+w /etc/sudoers,獲取權限。
2、如果要讓PHP運行我們自己寫的腳本,我在Google上看到用這個方法也是可以的。例如:www-data ALL=NOPASSWD: /tmp/script.sh
要寫明sh文件的具體位置
原文地址:https://exain.wordpress.com/2007/11/24/execute-system-commands-via-php/