簡體   English   中英

使用PHP shell_exec()執行BASH腳本,無法寫入文件

[英]Using PHP shell_exec() to execute BASH script, can't write files

我正在使用PHP編寫一個API,以通過POST將JSON參數傳遞給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權限的其他目錄,並使用apache用戶從命令行(PHP外部)執行腳本,所有這些都沒有問題。 僅在從shell_exec中執行時,我無法將任何內容寫入文件系統。

如果有幫助,我在使用Centos7。

最終罪魁禍首就是SELinux。 禁用后,我可以寫入特定目錄,但不能寫入其他目錄。 不知道為什么,但是即使禁用SELinux,通過shell_exec執行腳本時也無法寫入/ tmp,盡管通過cmd行執行時也可以。 但是shell_exec可以寫到我的httpd根目錄沒有問題。

檢查您的php.ini以查看是否設置了open_basedir。 這將限制您的php腳本在該目錄/子目錄之外進行寫入。

啟用它時,我遇到了同樣的問題,但無法寫入/ tmp

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM