在nginx上使用PHP-FPM的Exec(在chroot下)不返回任何内容

在nginx上使用PHP-FPM的Exec(在chroot下)不返回任何内容,nginx,php,chroot,Nginx,Php,Chroot,我已经用phpfpm在chroot/srv/http中创建了一个nginx服务器。这两个服务都使用http用户,并且工作正常。当我尝试运行exec命令(如 echo shell_exec('/usr/bin/ls'); 网页或错误中根本没有输出。我也试过了 error_log(shell_exec('/usr/bin/ls'); 还是什么都没有 我尝试过或知道的事情: 安全模式关闭 已启用exec 用户是http(使用phpinfo()) 显示错误=on 错误报告=全部 sudo/usr/b

我已经用phpfpm在chroot/srv/http中创建了一个nginx服务器。这两个服务都使用http用户,并且工作正常。当我尝试运行exec命令(如

echo shell_exec('/usr/bin/ls');
网页或错误中根本没有输出。我也试过了

error_log(shell_exec('/usr/bin/ls');
还是什么都没有

我尝试过或知道的事情:

  • 安全模式关闭
  • 已启用exec
  • 用户是http(使用phpinfo())
  • 显示错误=on
  • 错误报告=全部
  • sudo/usr/bin/chroot--userspec=http:http/srv/httpls工作正常
  • 可以使用文件内容和fopen/fread创建文件并从中读取
  • 尝试了shell_exec、exec、system和passthrough-没有任何效果
  • 尝试将2>&1附加到命令的末尾,但未执行任何操作
  • 我已经复制了所有必要的可执行文件和库
  • /srv/http/www(网页所在位置)下的所有库、二进制文件和所有内容都具有可执行和读取权限
  • doc_root是www

  • 据我所知,除了通过php fpm的shell命令外,所有东西都在chroot中工作。有人知道我哪里出错了以及如何修复吗?

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


    您可以将可执行文件复制到该目录,但要注意安全隐患。如果您将关键系统可执行文件复制到chrooted目录中,基本上就绕过了
    chroot

    的积极影响,这听起来可能很愚蠢,但您必须将
    /bin/sh
    (而不是
    /bin/bash
    )复制到
    chroot

    例如,请看这个问题:

    我没有得到任何输出

    echo shell_exec('/usr/bin/ls');
    
    要么。大概是因为
    ls
    不是一个文件,而是一个内置命令。运行:

    echo shell_exec('ls');
    
    产出:

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


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

    我已经这样做了。我将/usr/bin/ls复制到/srv/http/usr/bin/ls(在查看了ldd/srv/http/usr/bin/ls所需的库之后),将.so文件复制到/srv/http/usr/lib。但它仍然不起作用。请参见#6,我可以在chroot中运行它,这样我就有了所需的文件。还可以使用
    ldd sh
    查找它需要的库。