我正在使用 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 根目录没问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句