【问题标题】:Using PHP shell_exec() to execute BASH script, can't write files使用 PHP shell_exec() 执行 BASH 脚本,无法写入文件
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    检查您的 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

    【讨论】:

    • 感谢您的建议,但我的 php.ini 中没有设置该选项。
    猜你喜欢
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2016-07-28
    • 2012-10-22
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多