仅在 /tmp 中的 Apache 文件权限

Apache File Permissions only in /tmp

我正在使用 CentOS 7 和 PHP 7.2.5。我无法获得 move_uploaded_file()、file_put_contents() 或 exec('cp /tmp/test.txt /var/www/html/test.txt', $out);在除 /tmp 之外的任何文件夹中工作。 /var/www/html 由 apache:apache 拥有,权限为 755。我尝试了 777,但权限仍然被拒绝。它卡在 systemd-private-123abc-httpd.service-11cba/tmp/ 文件夹中,但我为 httpd 禁用了 PrivateTmp。

上传的文件已上传,一切正常,直到我尝试移动它。我可以将它移动到 /tmp 目录中的另一个文件名,但我不能将它移动到任何其他目录。

所有这些工作正常:

file_put_contents('/tmp/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
exec('cp /tmp/test.txt /tmp/test2.txt', $out); 
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/tmp/'.$file);

所有这些都给出警告:***:无法打开流:权限被拒绝

file_put_contents('/var/www/html/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/var/www/html/'.$file);
exec('cp /tmp/test.txt /var/www/html/test2.txt', $out); 

同样,/var/www/html 归 apache:apache 所有并设置为 755 权限。我完全不知所措。所有这些代码在旧服务器上运行良好,但绝对拒绝在新服务器上运行。我看了又看,但如果答案就在那里,它会被太多关于标准 file/directory 权限的答案挡住。

exec('cp /... 实际上并没有给出警告或错误。它有效或无效。它可以在 /tmp 目录中复制,但不能复制到其他任何地方。

正如上面评论中提到的,SELinux 是问题所在。我禁用了它,一切都按预期工作。我不想离开它,所以我尝试设置允许我需要的规则,遵循 these directions。这给了我错误 "semanage: error: unrecognized arguments: /var/www/html/test.txt"

I 运行 semanage fcontext -l > output.txt 并签出文件。已经有一条规则(对于 WordPress and/or Drupal)允许 read/write 用于 /var/www/html 中名为 "uploads" 的任何目录 /var/www/html(/.)?/上传(/.)?所有文件 system_u:object_r:httpd_sys_rw_content_t:s0

因此,我将目标目录移动到路径中带有 "uploads" 的目录。 mv -f /var/www/html/shared/pics/* /var/www/html/shared/uploads/pics

我将其全部更改为 apache:apache 并将权限设置为 755,它按预期工作。所以,如果 SELinux 给您带来问题,而您无法更改规则,请找到规则并遵守它们。

如果您仍然遇到问题,请尝试禁用系统 privateTmp。

我尝试了 "multi-user.target.wants" 解决方案,它有效,但在重新启动后,但在某些时候,PrivateTmp 返回 true。 就像我对 Apache2 的主要用途是 PHP,我最终编辑了 php.ini 并取消了 sys_temp_dir.

行的注释

默认情况下,系统使用函数 sys_get_temp_dir 分配的临时目录。函数 sys_get_temp_dir 将 return "/tmp" 但事实是您的 tmp 文件存储在某些路径,例如 /tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*。所以,对我来说工作是:

编辑 php.ini(路径可以在 PHP 个版本之间更改)

sudo nano /etc/php/7.2/cli/php.ini

然后取消注释 sys_temp_dir 行

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"