有的時候,通過php做很多系統操作的時候,並不如直接利用bash來的快。php-fpm預設是apache使用者,直接改成root賬戶,是啟動不了的。這樣的話,apache使用者無法執行root才能執行的命令。所以我們要先使php-fpm的啟動使用者,擁有執行shell的許可權,以及shell內部執行命令的許可權。
一,擷取root許可權
1,給具體進程指定無密碼訪問
# visudo //添加以下內容,檔案最下面有例子,照著寫
apache ALL=(ALL) NOPASSWD:/etc/init.d/srs
調用的時候
$result = shell_exec("/usr/bin/sudo /etc/init.d/srs start");
2,批定使用者無需密碼,切換root帳號
# visudo
apache ALL=(ALL) NOPASSWD: ALL
直接可以用sudo su切換成root使用者,許可權遠大於上面的方法,許可權越大,安全性越低。
3,針對某個shell指令碼,開放許可權
如果說第一方法,滿足不了要求,第二方法許可權過大,不安全,那麼第三種方法可以試試
# visudo
apache ALL=(ALL) NOPASSWD: UPLOADVIDEO
Cmnd_Alias UPLOADVIDEO = /var/www/srs/upload.sh
調用方法根一般調用方法一樣。
還有一點很重要就是visudo時注釋掉,#Default requiretty,因為php調用shell時,用不到終端
二,php調用shell怎麼調試
不好調試,無log可查,只能看輸出,nginx,php的log沒有調用shell的相關資訊,我有一些以經驗,屢試不爽
1,檢查php啟動使用者權限,檔案本身能被執行,php啟動使用者也要能執行該檔案的許可權。以前遇到過一個情況是,php執行一個shell怎麼都執行不了,後來才發麵,沒有chmod +x操作。
2,php是可以捕擷取shell的輸出的,但是要知道,不是所有命令執行都是有輸出的,也就是說,成功,失敗,或者沒執行沒辦法區別,搞不清。這個時候,我們可以shell指令碼中輸出,用echo就可以。這樣我們可以知道,執行到什麼地方,可以知道,在什麼地方出錯了。
3,直接通過su切換到php的啟動使用者,然後在linux命令列下執行,有人問了,nologin使用者無法su,那就直接useradd一個,改一下php的啟動使用者。如果用php的啟動使用者測試成功,通過php指令碼去執行,基本也是能通過的。
4,在這裡要注意一點,路徑問題,相對路徑和絕對路徑,盡量用絕對路徑。