使用 opendir() 扫描 /home/

Posted

技术标签:

【中文标题】使用 opendir() 扫描 /home/【英文标题】:scanning /home/ with opendir() 【发布时间】:2011-11-03 13:35:18 【问题描述】:

是否可以使用 opendir 和 scandir 扫描 /home/ 目录。当我尝试执行脚本时,它说权限被拒绝我该怎么办?

<?php

$dir = '/home/';
$dirs = scandir($dir);
?>
<pre>
<?php print_r($dirs); ?>
</pre>

【问题讨论】:

你可以,是的,但你需要拥有主目录的权限才能这样做。 【参考方案1】:

您可以使用is_readable('/home/') 来检查您是否有权限。如果没有,您需要确保该目录具有读取权限,可能是 0755 (rwxr-xr-x)

【讨论】:

在拥有 500 多个网站的服务器上设置 /home/ 的 chmod 755 有什么缺点吗? 在我的例子中,scandir 是在 /var/logs/project 上执行的,我必须确保所有文件夹(即 /var/var/logs/var/logs/project)对于非用户来说都是可读和可执行的在组中。我做了chmod 755 /varchmod 755 /var/logschmod -R 755 /var/logs/project【参考方案2】:

为了安全起见,PHP 定义了一个“basedir”,不允许您在下面访问。正如 Aleks G 所说,还需要考虑文件权限。

这个问题是关于如何绕过 basedir 限制:How can I relax PHP's open_basedir restriction?

Tom Haigh 的答案复制到这里:

您也可以使用 Apache(假设这是您的 Web 服务器)配置文件(例如 httpd.conf)在每个目录的基础上轻松完成此操作

<Directory /var/www/vhosts/domain.tld/httpdocs>
php_admin_value open_basedir "/var/www/vhosts/domain.tld/httpdocs:/var/www/vhosts/domain.tld/zend"
</Directory>

你也可以完全解除限制

<Directory /var/www/vhosts/domain.tld/httpdocs>
php_admin_value open_basedir none
</Directory>

【讨论】:

我试过了,但仍然无法访问它仍然权限被拒绝 然后,正如其他答案所说,您需要为apache进程启用读取权限。您可以chmod g+rx-w /home 并将 /home 文件夹的组从 root 更改为 www-data(或您的 apache 有权访问的任何内容 - 如果需要,请创建一个新组)【参考方案3】:

我不是 PHP 程序员,但我认为你的问题是当 PHP 尝试 opendir 时,它使用与 apache 相同的用户 ID 运行,可能没有读取 /home 目录的权限。

您可以通过更改 /home 的权限或将 apache 用户 ID 添加到任何拥有 home 组所有权的组来解决此问题。

这可能是您的 Apache 配置文件中的问题。即使文件系统权限允许,您的 httpd.conf 文件也可能不允许访问 /home。如果您的所有 html 文件都在 /var/www 中,通常就是这种情况。

httpd.conf 可能设置为允许从用户的主目录提供文件。在这种情况下,权限将被授予 /home 中的目录,但不会授予 /home 本身。

【讨论】:

【参考方案4】:

答案就在您的问题中:这是一个权限问题。最有可能的是,运行 Apache 的进程无权读取 /home 目录(或您的用户名,如果在 CLI 中运行)。在终端中手动执行此操作:

ls -ld /home

并检查属性。

【讨论】:

以上是关于使用 opendir() 扫描 /home/的主要内容,如果未能解决你的问题,请参考以下文章

Linux c —— opendir函数和readdir函数内涵及用法(转)

php中opendir函数用法实例

哪个更快: glob() 或 opendir()

有没有办法通过 SSH/SFTP 进行 opendir()、readdir() 类型的调用?

C语言readdir和opendir

readdir() opendir() 函数