使用 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 /var
、chmod 755 /var/logs
和chmod -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函数内涵及用法(转)