在 CentOS(以及 RHEL 系列)里,context 错误最常见于 SELinux 上下文(security context)不正确,比如:
Permission denied 但权限看起来没问题avc: deniedls -Z 看到的 context 不对下面按排查思路一步步来。
getenforce
Enforcing:会真正限制Permissive:只记录不限制Disabled:和 context 无关setenforce 0
如果问题消失,基本可以确认是 SELinux context 问题。
ausearch -m avc -ts recent
或
dmesg | grep avc
常见示例:
avc: denied { read } for pid=xxx comm="nginx"
name="index.html" dev="sda1" scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:default_t:s0
重点看:
scontext(进程)tcontext(文件)- 被拒绝的操作(read / write / execute)
ls -Z /path/to/file
ls -Zd /path/to/dir
例如 Web 目录应该是:
system_u:object_r:httpd_sys_content_t:s0
如果看到的是:
default_t
unlabeled_t
那基本就是 context 错了。
restorecon -Rv /var/www/html
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web
chcon -t httpd_sys_content_t /path/file
| 服务 | 正确 context |
|---|---|
| Nginx / Apache | httpd_sys_content_t |
| FTP | public_content_t |
| MySQL 数据 | mysqld_db_t |
| SSH 家目录 | user_home_dir_t |
ls -Z /var/www/html
restorecon -Rv /var/www/html
semanage fcontext -a -t httpd_sys_content_t "/srv/site(/.*)?"
restorecon -Rv /srv/site
chcon -t bin_t /usr/local/bin/myscript.sh
把下面信息发出来,我可以帮你精确判断:
cat /etc/redhat-release)ausearch -m avc)ls -Z 相关文件结果如果你说的 “context 错误”不是 SELinux(比如 systemd、PAM、Docker、Kubernetes),告诉我具体场景,我按那个方向帮你查。