fileperms():stat失败,但文件存在。

4
我是使用 OpenVPN Web GUI 软件的用户,但我遇到了一些问题,因为该程序无法找到所需的某个文件。该文件的ls -l如下:
-rw-r--r-- 1 root www 4153 Dec 20 10:12 /etc/openvpn/inn.crt

但是当我运行程序时,它声称该文件不存在。我尝试了这个sprintf('%d',fileperms($sLongFileName));,它引发了“无法stat”的警告。file_exists()也返回false。还存在另一个对PHP可见的文件:
-rw-r--r-- 1 root www 581 Dec 21 12:52 /etc/openvpn/crl.pem

这是什么原因造成的?

编辑:我让程序同时对两个文件进行了此操作:

file_put_contents("_dumpfile", "\n<<".$sLongFileName.">>\n", FILE_APPEND);

结果如下:
>>/etc/openvpn/inn.crt

<</etc/openvpn/crl.pem>>

文件路径有问题吗?


尝试在fileperms()函数中使用完整页面。接下来应该检查文件所有权问题。 - frustratedtech
如果你使用 var_dump($sLongFileName);,你会得到什么?看起来这个变量可能不包含正确的文件路径,特别是因为 file_exists() 也返回 false。 - DaveRandom
你使用哪个发行版?如果你使用的是Ubuntu或Suse,你可能需要查看AppArmor - 我经常看到这种情况。 - Eugen Rieck
@Marc:两个文件都在同一个目录下,其中一个是可读的。 - Mg D
该文件可能被其他进程锁定。这是许多操作系统中的一项功能:文件锁定。不仅要查找文件系统中指定的权限,还要查找在计算机运行时应用于操作系统内部的权限。 - hakre
显示剩余2条评论
1个回答

4

除了文件的物理存在之外,还有其他因素可能会防止您在特定用户下访问文件。

您需要验证使用 PHP 脚本执行这些调用的用户是否可以访问文件和包含文件的目录(这取决于您的服务器和 PHP 配置)。因此,首先找出用户名。

然后检查您的系统配置,例如 SELinux 是否由于某种原因阻止对文件的访问,例如网络请求导致访问不被允许的文件。


原来是因为有一个尾随回车符;程序中的 chomp() 没有修剪它们,只修剪了换行符。 - Mg D
好的,那么文件名是错误的。考虑使用字符串的十六进制转储来查找这些缺陷,参见:如何在PHP中获得字符串的十六进制转储? - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接