我正在使用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上。
可以請你連接到OS爲用戶Apache和測試命令,告訴我們了放? –
什麼是ls -lsa輸出爲myscript? –
您是否正在執行SELinux模式的系統上運行? apache用戶可能沒有使其能夠寫入/ tmp的策略。 –