定位命令沒有輸出
我通常會找到所有與 Unix 相關的問題的答案,這些問題已經以問答的形式發布。然而,這個特殊的問題在過去的一個小時裡讓我很難過,所以我想我會在這個網站上問我的第一個問題。
問題
我有一個執行 CentOS 5.11 的開發/登台伺服器伺服器。以普通使用者身份執行
locate
不會導致任何輸出(甚至不會出現錯誤消息):locate readdir
但是,以超級使用者身份執行該命令會列印一個有效結果列表:
$ sudo locate readdir /home/anthony/repos/php-src/TSRM/readdir.h /home/anthony/repos/php-src/ext/standard/tests/dir/readdir_basic.phpt ... etc.
strace
通常可以幫助我調試任何此類問題並執行strace locate readdir
節目:stat64("/var/lib/mlocate/mlocate.db", 0xbff65398) = -1 EACCES (Permission denied) access("/", R_OK|X_OK) = -1 EACCES (Permission denied) exit_group(1) = ?
檢查權限
我檢查了
locate
二進製文件及其預設數據庫的所有權和權限。正如預期的那樣,該命令作為組所有者setgid
使用slocate
,而數據庫具有適當的所有權和權限。$ ls -l /usr/bin/locate -rwx--s--x 1 root slocate 22280 Sep 3 2009 /usr/bin/locate $ sudo ls -l /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 78395703 May 8 04:02 /var/lib/mlocate/mlocate.db $ sudo ls -ld /var/lib/mlocate/ drwxr-x--- 2 root slocate 4096 Sep 3 2009 /var/lib/mlocate/
也沒有不尋常的文件屬性:
$ sudo lsattr /usr/bin/locate /var/lib/mlocate/mlocate.db ------------- /usr/bin/locate ------------- /var/lib/mlocate/mlocate.db
與工作系統比較
同時,生產伺服器上的一切都按預期工作。
locate readdir
以普通(非root)使用者身份執行會返回一個結果列表,因為它應該:$ locate readdir /usr/include/php/TSRM/readdir.h /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/POSIX/readdir.al /usr/share/man/man2/readdir.2.gz
為了比較,我也執行了這個命令,
strace
但是我得到了與登台伺服器上相同的權限被拒絕錯誤。在我閱讀sudo
. 在錯誤部分列出:使用 setuid 位的程序在被跟踪時沒有有效的使用者 ID 權限。
所以,不幸的是,我不能
strace
用於調試。我比較了暫存伺服器和生產伺服器之間所有上述命令的結果,它們之間沒有區別。兩個系統都有
mlocate-0.15-1.el5.2
沒有對其文件進行修改的 RPM,如rpm -V mlocate
.其他注意事項
我認為這可能與以下事實有關:在有問題的登台伺服器上,我的登錄名是使用 Winbind 進行身份驗證的,但我在同一個盒子上創建了一個普通的本地使用者,但我仍然遇到同樣的問題。顯然我還缺少其他東西,但我根本不知道它是什麼。
我懷疑它與 setgid 文件權限有關,可能是 PAM 或可能是 SELinux。我對 PAM 或 SELinux 都不太了解:我只在配置 Winbind 身份驗證時查看過 PAM,而 SELinux 與作業系統一起安裝,但我從未使用過它。
注意:生產伺服器比已經進行了一些實驗的開發伺服器進行的修改要少得多。
問題是(根目錄)的權限以及從輸出
/
中找到這一行的線索:strace
access("/", R_OK|X_OK) = -1 EACCES (Permission denied)
您缺少 的組讀取權限設置
/
。但是因為你仍然有x
(執行)權限,它允許你遍歷一個目錄,你仍然可以訪問文件系統上的所有文件,這就是為什麼在這些權限有效時大多數東西都繼續工作的原因。唯一不允許您做的事情是列出/
. 大多數命令不需要 list/
,它們要麼使用相對於目前目錄的路徑名,要麼使用訪問根目錄下特定知名目錄的絕對路徑名(如/etc
and/var
)。出於安全原因,
locate
即使它可以訪問由特權使用者生成的完整文件名清單,它也堅持只報告呼叫使用者通過從根目錄掃描整個文件系統能夠找到的結果。由於您無法列出/
,這使得直接從根目錄掃描任何內容都無法啟動,locate
因此根本不會報告任何內容。