PHP-无法使用函数chroot

PHP-无法使用函数chroot

我已经在 VPC 上安装了 Debian 6.0.6 x86,并且软件包尽可能少,当安装完成后,我会备份 VPC 并将其放在一边以供日后使用。

我已经通过安装了 PHP 5 aptitude install php5,并创建了一个包含以下内容的 PHP 脚本文件,并将其命名为 test.php:

    if ( function_exists("chroot") ) {
    echo "Function works !\n";
    } else {
    echo "Function does NOT work !\n";
    }

当我通过命令行运行脚本时,php -f test.php它会向我显示功能有效!到目前为止一切都很好。

由于 php5 包中的 PHP 版本相当旧,因此我想编译自己的版本 - 目前是 5.4.13 - 因此我恢复了备份的 VPC 映像并使用以下参数对其进行编译:

    ./configure
    --with-apxs2=/usr/bin/apxs
    --with-config-file-path=/etc/php
    --with-zlib-dir=/usr/local/zlib
    --with-bz2=/usr/local/bzip2
    --with-openssl=/usr/local/ssl
    --with-curl=/usr/local/curl
    --enable-mbstring
    --enable-intl

输出显示:

Running system checks
checking for chroot... yes

并且编译、制作和安装都完美完成。

当我重新创建并运行 test.php 脚本时,我收到消息Function does NOT work !

这里发生了什么事,我问自己,我是否以错误的方式运行脚本,因为文档说明了以下内容:此功能仅适用于 GNU 和 BSD 系统,并且仅在使用 CLI、CGI 或 Embed SAPI 时可用。此外,此功能需要 root 权限。或者是否存在配置不正确的情况?

更新:

我尝试让这个 chroot 函数工作的原因是因为我想安装 Symfony2。当我php composer.phar create-project symfony/framework-standard-edition /var/www/symfony2/root文件夹内运行时,它会抛出一个错误:

PHP Fatal error: require_once(): Failed opening required 'app/autoload.php' (include_path='.:/usr/local/lib/php') in /var/www/symfony2/vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php on line 24

但是,当我通过 apt-get 管理器安装 php5 包并运行相同的 composer 命令时,它运行正常。使用预编译的 deb php5 包,脚本会将当前工作目录更改为,而/var/www/symfony2我编译的 php 二进制文件则不会(我认为)。然后我发现我的 php 版本没有任何 chroot 功能,所以我认为这可能是罪魁祸首。

答案1

你已经准备好适合chrootPHP 的chroot了吗?

简单地设置一个任意目录是不够的 - 您实际上需要构建 chroot 并确保它包含所有必要的库、设备和二进制文件。

否则,DNS 解析等基本功能将无法正常工作,您将遇到随机错误、挂起或应用程序段错误。听起来您误认为open_basedirchroot 的简单性。

首先,这个脚本一旦定制,就会为您提供 chroot 的基础。

http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh

Dotdeb 已经包含 PHP 的预编译二进制文件

Dotdeb repo 保留了 PHP 最新版本的预编译版本 - 并且实现起来更加容易和快捷。

http://www.dotdeb.org/

答案2

首先chroot()不是解决您的问题。请彻底了解chroot() 是什么,以及在尝试使用它之前它会做什么,否则你会毫无理由地让自己痛苦不堪。

解决问题所需要做的是设置 PHP 查找require文件的路径(包含路径)。 有一个函数可以实现这个,或者您可以将其设置在 中php.ini
或者,从 Symfony 安装的根目录(您也在其中提取了框架)运行 Symfony 安装脚本 *,这正是您应该做的...

相关内容