使用PHP shell_exec()执行BASH脚本,无法写入文件

时间:2017-08-16 21:28:43

标签: php linux bash apache shell

我使用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);

?>

&#39;的MyScript&#39;是一个简单的测试脚本,包含以下内容:

#!/bin/bash

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

执行脚本有效,我得到第一个回显,显示参数已成功通过。但是,尝试在脚本中执行任何写入文件系统(第二个回声)的操作都不会发生。这就好像权限是一个问题,但我确保写入&#39; apache&#39;用户拥有完全权限。我也尝试将apache和我的脚本命令添加到sudoers并通过sudo无密码运行,没有运气。通过在我的php和bash脚本中添加适当的调试命令,我已经验证了路径是明确和正确的,用户是正确的,如已发布的其他数百万个问题所示。如果我从命令行运行它,脚本显然工作正常。它也有效(并且可以写入文件系统)如果我是sudo -u apache&#39;运行脚本,所以我知道权限不是问题。我被卡住了。有什么想法吗?

使用更多信息进行编辑:我还尝试禁用SELinux,验证所有者/权限,尝试使用777权限写入其他目录,并使用apache用户从命令行(PHP外部)执行脚本,所有这些都没有问题。只有在shell_exec中执行时,我才能向文件系统写入任何内容。

如果有帮助,我就在Centos7上。

2 个答案:

答案 0 :(得分:1)

罪魁祸首最终成为了SELinux。禁用后我可以写入特定目录,但仍然不能写入其他目录。不知道为什么,但即使SELinux被禁用,我也无法在通过shell_exec执行脚本时写入/ tmp,尽管我可以通过cmd行执行。但是shell_exec可以写入我的httpd根目录没问题。

答案 1 :(得分: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