使用root调用os.OpenFile打开0666权限文件时提示permission denied
问题排查与解决
先从几个容易被忽略的系统层面限制入手排查:
1. 检查文件扩展属性
Linux文件可设置immutable(不可修改)扩展属性,哪怕root用户也无法修改或写入这类文件。执行命令查看:
lsattr /tmp/kd.log
如果输出包含i标记,说明文件被设为不可修改,执行以下命令移除该属性:
chattr -i /tmp/kd.log
2. 确认/tmp目录权限
虽然目标文件权限是-rw-rw-rw-,但父目录/tmp需要有执行权限才能允许用户访问其中的文件。执行命令检查:
ls -ld /tmp
正常权限应为drwxrwxrwt,如果不符,修复权限:
chmod 1777 /tmp
3. 排查安全模块限制
如果系统启用了SELinux或AppArmor,可能会拦截root用户的文件操作:
- 检查SELinux状态:
若输出为getenforceEnforcing,临时关闭测试:
重新运行代码,若不再报错,说明是SELinux策略限制,可通过调整SELinux规则(如添加允许该程序访问文件的策略)解决,不推荐永久关闭SELinux。setenforce 0
4. 排除文件残留引用
虽然lsof无输出,但可能存在文件已被删除但仍被进程持有的情况,执行以下命令排查:
find /proc -name "kd.log" 2>/dev/null
如果找到相关进程,终止进程后再测试。
另外,代码中的0o666仅在文件不存在时生效,现有文件的权限不受此参数影响,无需修改代码中的权限设置。
内容的提问来源于stack exchange,提问作者fakeKmz
相关产品推荐
相关产品推荐

