编译后的C程序普通用户无法运行,root身份可正常执行
问题分析与解决
环境信息
- 系统:RHEL8 4.18.0-372.19.1.el8_6.x86_64
- SELinux:已启用
- FIPS:已启用
- 程序代码:
#include <stdio.h> int main( void ) { fprintf( stdout, "Running test Program...\r\n" ); }
- 编译命令:
gcc test.c -o test - 执行情况:普通用户
dev运行./test提示-bash: ./test: Operation not permitted,root通过sudo运行正常 - 文件权限:
-rwx------,属主属组均为dev,所在分区无noexec属性
问题根源
核心原因是SELinux安全上下文配置不符合规则。RHEL8中启用SELinux后,即使文件权限设置正确,若文件的SELinux上下文不允许普通用户执行,就会触发权限拒绝;而root用户默认不受SELinux的部分限制,因此可以正常运行。
排查与解决步骤
检查SELinux上下文
执行命令查看文件的SELinux标签:ls -Z test正常可执行文件的上下文通常为
unconfined_u:object_r:bin_t:s0(系统二进制文件)或unconfined_u:object_r:user_home_t:s0(用户家目录下的可执行文件)。如果显示的上下文不属于这两类(比如system_u:object_r:default_t:s0),就会导致普通用户无法执行。临时修复上下文
使用chcon命令临时修改文件的SELinux上下文,使其符合可执行规则:chcon -t bin_t ./test修改后再次用普通用户运行
./test,验证是否正常。永久修复上下文
若需要永久生效,使用semanage设置默认上下文规则,再恢复标签:# 假设文件路径为/home/dev/test,添加上下文规则 semanage fcontext -a -t bin_t "/home/dev/test" # 应用规则到文件 restorecon -v ./test排除其他可能性
- FIPS模式主要限制加密算法使用,此程序未涉及加密操作,因此排除FIPS影响。
- 分区已确认无
noexec属性,文件权限也正确,无需再检查这两项。
内容的提问来源于stack exchange,提问作者krbo3
相关产品推荐
相关产品推荐

