2017-08-16 243 views
1

我正在使用PHP編寫API來通過POST將JSON參數傳遞給BASH腳本。下面是我在做什麼蒸餾版本:使用PHP shell_exec()來執行BASH腳本,無法寫入文件

<?php 

$params = json_decode(file_get_contents('php://input'), true); 

$cmd = "/bin/bash /path/to/myscript " . $params["value1"] . " " . $params["value2"] . " " . $params["value3"]; 
$output = "Command: " . $cmd . "\n\nResponse: " . shell_exec($cmd); 

print($output); 

?> 

「的MyScript」是一個簡單的測試腳本如下:

#!/bin/bash 

echo -e "Executing script...your parameters are: [$1] [$2] [$3]\n" 
echo -e "test" > /tmp/test.txt 

執行該腳本,我得到的第一個回顯顯示參數已成功通過。但是,在寫入文件系統的腳本(第二個回顯)中嘗試做任何事情都不會發生。就好像權限是一個問題,但我已經確保寫入'apache'用戶擁有完全權限的目錄。我也嘗試添加Apache和我的腳本命令sudoers和通過sudo密碼運行,沒有運氣。通過在我的php和bash腳本中添加適當的調試命令,我已經證實路徑是明確和正確的,用戶是正確的,正如已經發布的數百萬個其他問題所建議的。如果我從命令行運行腳本,腳本顯然工作正常。如果我使用sudo -u apache來運行腳本,它也可以工作(並且可以寫入文件系統),所以我知道權限不是問題。我被卡住了。有任何想法嗎?

編輯更多信息:我也嘗試禁用SELinux,驗證所有者/權限,嘗試寫入其他具有777權限的目錄,並執行腳本從命令行(PHP以外)與Apache用戶,所有沒有的問題。只有在shell_exec內執行時,我才能寫入任何文件系統。

如果有幫助,我在Centos7上。

+0

可以請你連接到OS爲用戶Apache和測試命令,告訴我們了放? –

+1

什麼是ls -lsa輸出爲myscript? –

+0

您是否正在執行SELinux模式的系統上運行? apache用戶可能沒有使其能夠寫入/ tmp的策略。 –

回答

0

罪魁禍首最終成爲了SELinux。禁用後,我可以寫入特定的目錄,但仍然不是其他人。不知道爲什麼,但即使禁用SELinux,當通過shell_exec執行腳本時,我無法寫入/ tmp,儘管我可以通過cmd行執行。但是,shell_exec可以寫入我的httpd根目錄沒有問題。

0

檢查你的php.ini,看看是否設置了open_basedir。這會限制你的php腳本在該目錄/子目錄之外寫入。

我有同樣的問題,當我啓用它,無法寫入到/ tmp

grep open_basedir /etc/php/7.0/apache2/php.ini # Ubuntu 

http://php.net/manual/en/ini.core.php#ini.open-basedir

+0

感謝您的建議,但該選項未在我的php.ini中設置。 – Antennae