2016-04-06 18 views
2

我發現了許多問題,通過打開權限或更改文件的用戶所有權的巨大漏洞做到這一點。對於我目前的應用程序,這些都不是一種選擇。我試圖做的是使用shell_exec或類似的php函數在我的系統上完全不同的文件夾中運行.sh腳本,當我的網頁上單擊按鈕時。該腳本必須從它是在文件夾中運行我在Debian和已安裝sudo來讓apache用戶通過將這些線運行命令:如何從非擁有文件夾中的apache用戶運行腳本?

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh start 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh stop 
www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh status 

的run.sh是不是我允許編輯,所以我必須在可能的情況下在apache端進行管理。我不允許更改run.sh的權限或所有權。所以你可以看到我的困境。 PHP的電話我使用這個樣子的:

$test=shell_exec('cd /opt/folder/ && ./run.sh start&& cd -'); 

我使用$測試呼應該命令的輸出。這裏是奇怪的地方。命令有很好的輸出。 run.sh腳本用於啓動和停止其他程序的列表並顯示其狀態。我可以運行./run.sh status並在$ test變量中得到一個好結果。如果我嘗試./run.sh stop它說它工作(我非常確定run.sh腳本沒有太多的檢查內置),但實際上系統上沒有發生任何事情。我可以運行一個ps -ef | grep作爲完整性檢查,並查看所有應該停止的進程。如果我運行./run.sh start也是一樣,但它會返回沒有任何程序啓動。

所以說,我只是想弄清楚我做錯了什麼。我確信php正在運行bash腳本,但出於某種原因,它沒有能力在腳本中實際運行任何啓動或停止命令。我可以從操作系統以root身份完全運行run.sh。我真的在我的繩索結尾,所以任何幫助都非常感謝。如果這不可能,那麼是否有替代方案不需要額外的程序安裝。

回答

0

所以經過幾次嘗試後,我決定保存這個以備後用。我意識到,儘管我允許apache用戶以root身份運行腳本,但我並沒有真正地告訴它。爲了解決這個問題我做出了改變

$test=shell_exec('cd /opt/folder/ && sudo ./run.sh start&& cd -'); 

添加的須藤現在告訴腳本以root身份運行,並在visudo命令條目允許它不要求輸入密碼來這樣做。我確實改變了我的visodu文件,讓它變得更加纖細,所以現在它只有一行。

www-data ALL=(ALL) NOPASSWD:/opt/folder/run.sh

這符合雙方的安全要求和用戶約束。幾乎沒有任何攻擊媒介可以打開,因爲chmod 777等會導致攻擊媒介,並且apache用戶只能使用它包含的硬編碼參數訪問run.sh腳本。

0

我最近發佈了一個項目,它允許PHP獲得真正的Bash shell並與之交互(如果需要的話,作爲root用戶,但我不認爲你需要它),它解決了exec()和shell_exec()的限制。在這裏獲得:https://github.com/merlinthemagic/MTS

下載您只需使用下面的代碼後:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false); 
$return1 = $shell->exeCmd('cd /opt/folder/'); 
$return2 = $shell->exeCmd('./run.sh start'); 
$return3 = $shell->exeCmd('cd -'); 
//the return will be a string containing the return of the command 
echo $return1; 
echo $return2; 
echo $return3; 

因爲你不需要根,確實沒有任何安全問題。當您安裝軟件包時,只需跳過關於設置sudo的部分即可。

另外,如果你的'跑。sh'需要很長時間才能完成,您需要更改該命令的超時時間,例如:

//is one hour enough? 
$timeout = 3600000; 
$return2 = $shell->exeCmd('./run.sh start', null, $timeout); 
相關問題