【问题标题】:fileperms(): stat failed, but the file existsfileperms(): stat 失败,但文件存在
【发布时间】:2012-01-26 22:03:37
【问题描述】:

我正在使用OpenVPN Web GUI,但我遇到了一些问题,因为程序没有看到必要的文件之一。该文件的ls -l如下:

-rw-r--r-- 1 root www 4153 Dec 20 10:12 /etc/openvpn/inn.crt

但是当我运行程序时,它声称该文件不存在。我试过这个sprintf('%d', fileperms($sLongFileName));,它会引发“无法统计”警告。 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() 函数中使用整页。接下来是检查文件所有权问题。
  • 如果你var_dump($sLongFileName);,你会得到什么?似乎不能包含正确的文件路径,尤其是因为file_exists() also returns false
  • 您在哪个发行版上运行?如果您有 Ubuntu 或 Suse,您可能需要查看 AppArmor - 经常看到这种情况
  • 请用hexdump输出文件,看起来很奇怪
  • 该文件可以被网络服务器读取,但是/etc/openvpn 目录呢?您可以授予文件本身所需的所有权限,但如果目录不允许访问,您将无法访问该文件。

标签: php file permissions apache2


【解决方案1】:

除了文件的实际存在之外,可能还有其他不同的因素会阻止您在特定用户下访问该文件。

您需要通过您的 PHP 脚本用来执行这些调用的用户(取决于您的服务器和 PHP 配置)验证您是否可以访问该文件以及该文件所在的目录。所以首先找出哪个是用户名。

然后检查您的系统配置,如果 SELinux 等实用程序由于某种原因阻止访问文件,例如webrequest 导致对不允许访问的文件进行文件访问。

【讨论】:

  • 原来有一个尾随回车;程序中的chomp() 没有修剪这些,只有换行符。
  • 好的,那么文件名是错误的。考虑使用字符串的 hexdump 来查找这些缺陷,请参阅:How can I get a hex dump of a string in PHP?
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2021-09-25
  • 2019-04-06
  • 1970-01-01
相关资源
最近更新 更多