Permissions

不應該發生的 EACCES

  • December 7, 2018

我在 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 盒子。

最後發現問題確實與 SELinux 有關。

對於可能需要快速了解 SELinux 是什麼以及一些有用命令的其他任何人,我推薦SELinux 僅用於凡人youtube 影片。這是開始進行故障排除的一個很好的介紹。

引用自:https://unix.stackexchange.com/questions/96439