PHP fopen 总是因权限被拒绝而失败

Kev*_*ney 9 php suexec apache-2.2

我正在将几个 Wordpress 博客迁移到 AWS,但遇到了文件权限问题,该问题在过去几个小时内成功阻止了我。

最简单的 fopen 调用总是失败,并显示“无法打开流:权限被拒绝”:

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>
Run Code Online (Sandbox Code Playgroud)

我已经尝试/检查了以下内容

  • 我正在写入的目录具有正确的文件权限 (755) 和正确的所有权。一直到 /home 的路径都是如此。
  • 我正在编写由getcwd()确认的正确目录
  • 测试 PHP 脚本散列与我尝试写入的路径相同的所有权并更正权限 (644)。
  • 我正在运行 mod_suexec 以确保使用与我写入的路径相同的用户和组来执行脚本。函数getmyuid()getmygid()返回正确的用户和组 ID(编辑:这是错误的,见下文)。
  • PHP 安全模式在 php.ini 中被禁用。
  • fopen 不是不允许的 PHP 函数。
  • 禁用open_basedir的使用。

有什么我错过的可能会导致这种情况吗?我怀疑我已经盯着这个看了很长时间,我错过了一些明显的东西。

更新:在应用了womble 的建议后,我开始认为这个问题不仅仅是错误的权限或 PHP 配置错误。我确实设法让上面的代码写出一个文件,但是即使使用正确的用户和组执行 PHP 脚本,生成的文件所有权和组也被设置为 apache 的所有权和组。如果我从命令行执行相同的测试脚本,则发出的文件具有正确的权限。这让我相信这是我使用 mod_suexec 的问题。

编辑:我对getmyuid()getmygid()的使用不正确,因为它们只返回脚本文件的用户和组,而不是它运行的权限。更正确的方法是使用像这样的 comething:

<?php echo exec('ps -up '.getmypid()); ?>
Run Code Online (Sandbox Code Playgroud)

wom*_*ble 5

好问题——表明你已经完成了你的功课。

我想不出任何你没有检查的“明显”,所以我只能给你一些更高级的调试建议。

  • 启动stracePHP 进程,看看它到底在做什么。
  • 编写一些代码fopen(..., 'r')来三重检查您的目录树权限,实际上没有问题。
  • su给有问题的用户并尝试在命令行上做一些事情。如果这有效,那么您就知道您的脚本没有以您认为的权限运行。
  • 检查文件、目录或前导路径组件(getfacl是要使用的工具)上是否没有扩展 ACL 。这并不常见,但每隔一段时间它们就会跳起来撕掉你的脸。如果您确实有 ACL,setfacl -x请在确认它们是不必要的后使用删除它们。


小智 -1

2件事。

  1. 您需要在 die 语句中转义撇号。
  2. 5 为 rx,6 为 rw-。我会将您的权限设置为 0766 -rwxrw-rw-