You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.4下ACL配置rwx后PHP脚本仍报Permission denied问题求助

问题原因

1. 目标文件本身缺少读权限

你提供的文件权限结果--wxrwxrwT+ 1 nobody nogroup 480 Oct 23 00:02 /tmp/RebuildCat_sequence.cnt显示,属主nobody的权限仅有写入、执行权限,无读权限。
如果你的fopen使用r/r+等需要读权限的打开模式,自然会触发权限报错;而file_put_contents默认使用w(只写、截断创建)模式,不需要读权限,所以可以正常执行,和你描述的现象完全吻合。

2. systemd的PrivateTmp目录隔离

Ubuntu 20.04默认给cron、php-fpm等systemd管理的服务开启PrivateTmp=yes参数,该参数会为服务进程单独挂载私有的/tmp命名空间,你在宿主机shell中看到的/tmp目录,和cron触发的PHP进程实际访问的/tmp目录完全隔离,你在宿主机对/tmp做的所有权限修改、文件操作,进程都无法感知,也会触发权限报错。

排查步骤

  • 确认fopen的打开模式:在报错代码处打印fopen的第二个参数,确认是否使用了需要读权限的模式。
  • 验证文件权限:执行getfacl /tmp/RebuildCat_sequence.cnt,确认nobody用户对该文件有读权限。
  • 验证PrivateTmp配置:执行systemctl show cron.service | grep PrivateTmp,如果输出PrivateTmp=yes则说明开启了目录隔离。也可以在PHP脚本中加入shell_exec('cat /proc/'.getmypid().'/mounts | grep /tmp')打印进程的挂载信息,如果输出的是tmpfs类型的临时挂载,而非你宿主机的/dev/md2分区,即可确认隔离生效。

解决方法

  1. 针对文件权限问题:
    执行chmod u+r /tmp/RebuildCat_sequence.cnt为nobody用户添加读权限即可。如果文件是定期自动生成的,在生成文件的代码中设置umask为0002,避免后续新生成的文件出现权限不足问题。

  2. 针对PrivateTmp隔离问题,二选一即可:

  • 关闭cron的PrivateTmp配置:执行systemctl edit cron.service,在打开的配置文件中添加以下内容:
[Service]
PrivateTmp=no

保存后执行systemctl daemon-reload && systemctl restart cron.service生效。

  • 更换共享文件存储目录:放弃使用/tmp存储跨场景共享的文件,新建专属目录如/var/lib/rebuildcat,为nobody、systemd-timesync用户配置对应目录权限,完全避开/tmp的隔离机制,安全性和稳定性更高。

内容的提问来源于stack exchange,提问作者kklepper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:54:06