【问题标题】:Exec with PHP-FPM on nginx (under chroot) returns nothing在 nginx 上使用 PHP-FPM 执行(在 chroot 下)不返回任何内容
【发布时间】:2013-06-05 01:28:21
【问题描述】:

我已经使用 php-fpm 在 /srv/http 的 chroot 中创建了一个 nginx 服务器。两种服务都使用 http 用户并且工作正常。当我尝试运行诸如

之类的 exec 命令时,问题就出现了
echo shell_exec('/usr/bin/ls');

网页上或错误中根本没有输出。我也试过了

error_log(shell_exec('/usr/bin/ls');

还是什么都没有。

我尝试过或知道的事情:

  1. 安全模式关闭
  2. 已启用执行
  3. 用户是http(使用phpinfo())
  4. display_errors = 开启
  5. error_reporting = E_ALL
  6. sudo /usr/bin/chroot --userspec=http:http /srv/http ls 工作正常
  7. 可以使用 file_puts_content 和 fopen/fread 创建文件并从中读取
  8. 尝试了 shell_exec、exec、system 和 passthrough - 没有任何效果
  9. 尝试将 2>&1 附加到命令末尾,但什么也没有
  10. 我已经复制了所有必要的可执行文件和库
  11. /srv/http/www(网页所在的位置)下的所有库、二进制文件和所有内容都具有可执行和读取权限
  12. doc_root 是 www

据我所知,一切都在 chroot 中运行,除了通过 php-fpm 的 shell 命令。任何人都知道我哪里出错以及如何解决它?

【问题讨论】:

    标签: nginx php chroot


    【解决方案1】:

    这听起来可能很愚蠢,但您必须将/bin/sh(而不是/bin/bash!)复制给您chroot

    例如看这个问题:How do I change the shell for php's exec()

    【讨论】:

    • 也可以使用ldd sh 找到它需要的库。
    【解决方案2】:

    如果您chroot 到某个目录,则该目录将成为您所有 PHP 脚本的根目录。这意味着,如果您在 PHP 中执行 /usr/bin/ls,它将尝试执行 /srv/http/usr/bin/ls

    您可以将可执行文件复制到该目录 - 但请注意安全隐患。如果您将关键的系统可执行文件复制到 chrooted 目录中,您基本上会绕过chroot 的积极影响。

    【讨论】:

    • 我已经这样做了。我将 /usr/bin/ls 复制到 /srv/http/usr/bin/ls (在看到 ldd /srv/http/usr/bin/ls 所需的库之后),我将 .so 文件复制到 /srv/ http/usr/lib。它仍然没有工作。看看#6,我可以在 chroot 中运行它,所以我有需要的文件。
    【解决方案3】:

    我没有输出

    echo shell_exec('/usr/bin/ls');
    

    要么。大概是因为ls 不是文件而是内置命令。运行:

    echo shell_exec('ls');
    

    输出:

    css 演示 favicon.ico 图片 js path.php robots.txt routing.php 测试

    这是我的站点根目录中的文件列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2021-11-24
      • 2019-08-09
      • 2017-06-05
      • 2015-04-20
      • 2021-04-02
      • 2020-02-22
      相关资源
      最近更新 更多