在nginx上使用PHP-FPM执行exec(在chroot下)不返回任何内容

时间:2013-06-09 03:30:51

标签: nginx php chroot

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

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

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

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

仍然没有。

我尝试或知道的事情:

  1. 安全模式关闭
  2. exec enabled
  3. 用户是http(使用phpinfo())
  4. display_errors = on
  5. error_reporting = E_ALL
  6. sudo / usr / bin / chroot --userspec = http:http / srv / http ls工作正常
  7. 可以使用file_puts_content和fopen / fread
  8. 创建文件并从中读取
  9. 试过shell_exec,exec,system和passthrough - 没什么用“
  10. 尝试将2>& 1附加到命令的末尾,而不是
  11. 我已经复制了
  12. 所需的所有可执行文件和库
  13. / srv / http / www(网页所在的位置)下的所有库,二进制文件和所有内容都具有可执行和读取权限
  14. doc_root是www
  15. 据我所知,除了通过php-fpm的shell命令外,一切都在chroot中工作。任何人都知道我哪里出错了以及如何解决它?

3 个答案:

答案 0 :(得分:1)

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

例如,请参阅此问题:How do I change the shell for php's exec()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我的

没有输出
echo shell_exec('/usr/bin/ls');

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

echo shell_exec('ls');

输出:

  

css demos favicon.ico图片js path.php robots.txt routing.php test

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