我正在使用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的策略。 –