【发布时间】:2018-01-25 04:06:22
【问题描述】:
我正在使用 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 上。
【问题讨论】:
-
你能以 apache 用户身份连接到 os 并测试命令并告诉我们输出吗?
-
myscript 的 ls -lsa 输出是什么?
-
您是否在以强制模式运行 SELinux 的系统上? apache 用户可能没有允许它写入 /tmp 的策略。
-
@Arash 正如 OP 中提到的,我已经从命令行以“sudo -u apache”运行,并且脚本按预期工作。
-
@JeffSchaller 我确实有一个 SELinux 环境,但我尝试的第一件事是设置许可模式。
标签: php linux bash apache shell