4

我使用 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 = on
  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 命令。任何人都知道我哪里出错以及如何解决它?

4

3 回答 3

1

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

例如看到这个问题:如何更改 php 的 exec() 的 shell

于 2013-07-14T07:29:16.143 回答
0

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

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

于 2013-06-09T09:41:36.760 回答
0

我没有输出

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

任何一个。大概是因为ls不是文件而是内置命令。跑步:

echo shell_exec('ls');

输出:

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

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

于 2013-07-14T07:45:01.220 回答