不应该发生的 EACCES

不应该发生的 EACCES

我在 Linux 机器上遇到了一个我无法真正解释的情况。

一些背景:我们正在运行带有 ac/c++ 模块的 apache,该模块将请求转发到我们的应用程序。它通过读取 .port 文件来实现此目的,该文件指定要将请求发送到的本地端口。

安装后,无法使用 Web 界面进行连接。经过一些故障排除后,我拿出 strace 并发现 apache 进程无法读取 .port 文件:

[pid  8105] stat("/tmp/somedir/application.port", 0x7ffff9694470) = -1 EACCES (Permission denied)

我检查文件的权限:

% ls -l /tmp/somedir/application.port
-rw-r--r--. 1 appuser staff    5 Oct 16 14:10 application.port

那么,任何人都应该能够读懂它,对吧?

我检查 apache 进程的运行方式:

% ps -ef | grep 8105
appuser   8105  3357  0 15:14 ?        00:00:00 /usr/sbin/httpd

因此 apache 进程以文件所有者的身份运行。那也应该有效,对吧?

最后,我这样做:

% su - appuser
% stat /tmp/somedir/application.port
  File: `/tmp/somedir/application.port'
  Size: 5           Blocks: 8          IO Block: 4096   regular file
Device: 11h/17d Inode: 1400293     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/ appuser)   Gid: ( 1001/   staff)
Access: 2013-10-16 14:10:03.357679902 +0200
Modify: 2013-10-16 14:10:03.357679902 +0200
Change: 2013-10-16 14:10:03.357679902 +0200

那么,“appuser”拥有该文件,运行 Web 服务器,但无权从 Web 服务器进程内对其执行 stat() 操作?有人知道这里会发生什么吗?

我还应该提到,这不是我们完成的第一次安装,其他安装都按预期工作。在安装这台特定机器的过程中可能存在一些手动调整,但我仍然不明白我们怎么会变成这样。

重新启动进程也不会改变行为。

该机器是RHEL 6盒子。

答案1

最后发现问题确实与SELinux有关。

对于任何可能需要快速了解 SELinux 是什么以及一些有用命令的人,我推荐面向凡人的 SELinuxYoutube 视频。这是一个很好的故障排除入门介绍。

相关内容