我正在尝试针对特定目录(在我的情况下为/ home / gregh / Mail)发出open_dir函数,但它失败了。当我使用is_dir和is_file检查目录时,它们都返回false(见下文)。我检查了目录和父目录的权限,并且都有775个privs,而apache用户甚至拥有与目录所有者相同的组的成员资格。
print("DEBUG - dir = self::SBD_ROOT_PATH = " . self::SBD_ROOT_PATH . " <P>");
print("DEBUG - is_dir(self::SBD_ROOT_PATH) = ");
var_dump(is_dir(self::SBD_ROOT_PATH));
print("DEBUG - is_file(self::SBD_ROOT_PATH) = ");
var_dump(is_file(self::SBD_ROOT_PATH));
这会产生以下输出:
DEBUG - dir = self::SBD_ROOT_PATH = /home/gregh/Mail
DEBUG - is_dir(self::SBD_ROOT_PATH) = bool(false)
DEBUG - is_file(self::SBD_ROOT_PATH) = bool(false)
以下是一些目录设置信息:
[gregh@proteus ~]$ whoami
gregh
[gregh@proteus ~]$ groups
gregh apache admin
[gregh@proteus ~]$ ls -l /home/gregh
drwxrwxr-x. 6 gregh admin 4096 Mar 1 11:46 Mail
然后我sudo到“apache用户”:
-bash-4.1$ whoami
apache
-bash-4.1$ groups
apache admin
-bash-4.1$ ls /home/gregh/Mail
7012 7052 email_backup Errors float_data sbd
我还添加了一个检查以查看:is_dir(“/ home / gregh”)返回和is_dir(“/ home”)返回。有趣的是,is_dir(“/ home / gregh”)返回FALSE,is_dir(“/ home”)返回TRUE。
具体来说,为什么“is_dir”函数返回false?这似乎指向某种特权问题,但我无法弄清楚它是什么。有什么想法吗?
答案 0 :(得分:0)
您要求提供故障排除提示,因此这些是我要添加的内容:
clearstatcache();
echo file_exists(self::SBD_ROOT_PATH);
print_r(fstat(self::SBD_ROOT_PATH));
shell_exec('getfacl '.escapeshellarg(self::SBD_ROOT_PATH));
某些版本的Linux上的ACL权限让我感到困惑,这就是最后一行的内容。
需要注意的另一件事是Apache / PHP必须到达你的目录;如果它对上面的所有目录都没有至少'rx'的权限,那么它可能不会那么远吗?