Permissions
不應該發生的 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 盒子。
最後發現問題確實與 SELinux 有關。
對於可能需要快速了解 SELinux 是什麼以及一些有用命令的其他任何人,我推薦SELinux 僅用於凡人youtube 影片。這是開始進行故障排除的一個很好的介紹。