最近在開發一個服務端程式,測試過程發現了一個小問題,借此記錄下。
場景的描述大緻是這樣的:程式以root使用者啟動,打開一個檔案A,fork一個子程序以非root使用者運作,改變檔案A的屬主為子程序的運作使用者;子程序在運作過程可能會重新打開檔案A
問題就是由重新打開檔案A觸發的,示範如下:
假設我把程式放在/root/test目錄下(預設情況下/root目錄的權限會特殊些,隻為友善示範, 實際上一般不會把程式安裝在該目錄下)
1.啟動程式
[root@localhost test]# ./sbin/server
[root@localhost test]# ps auxf | grep server | grep -v grep
root . . ? Ss : : server: master
nobody . . ? S : : \ server: worker
2.子程序執行重新打開檔案A的操作後收到一條錯誤
收到這樣一條錯誤一開始以為是檔案A的權限有問題
3.檢視檔案A的權限
[root@localhost test]# ls -l logs/
-rw-r--r-- nobody root Oct : error.log
4.接着檢視是否目錄權限問題
[root@localhost test]# ls -ld
drwxr-xr-x root root Oct 09:
都沒有發現問題,索性再看一下上級目錄權限呗
[root@localhost test]# ls -ld /root
drw-r-x--- root root Oct : /root
[root@localhost test]# ls -ld /
drwxr-xr-x root root Oct 09: /
問題就出在/root目錄沒給其他使用者權限(通過id指令得知子程序的有效使用者不屬于root使用者組),給其他使用者加上x權限(隻加r權限依然不能解決問題,本例需要的是能進入/root目錄的權限)再測試一下就可以了,測試完記得把/root的權限還原
啰嗦了這麼多,本例問題的原因總結一句話:程序的有效使用者沒有進入檔案A所在目錄或間接上級目錄的權限。