本人對unix下的程序的實際使用者id和有效使用者id一直都比較迷惑,沒有完全搞清楚。最近溫習apue(《高階unix環境程式設計》),終於對這兩個概念有了乙個清晰的認識,看來經典著作絕對需要溫習多遍,才能領略其中的奧秘。
在unix程序中涉及多個使用者id和使用者組id,包括如下:
1、實際使用者id和實際使用者組id:標識我是誰(據說這是乙個**的哲學問題,難死一片哲學家)。也就是登入使用者的uid和gid,比如我的linux以simon登入,在linux執行的所有的命令的實際使用者id都是simon的uid,實際使用者組id都是simon的gid(可以用id命令檢視)。unix系統通過程序的有效使用者id和有效使用者組id來決定程序對系統資源的訪問許可權。2、有效使用者id和有效使用者組id:程序用來決定我們對資源的訪問許可權。一般情況下,有效使用者id等於實際使用者id,有效使用者組id等於實際使用者組id。當設定-使用者-id(suid
)位設定,則有效使用者id等於檔案的所有者的uid,而不是實際使用者id;同樣,如果設定了設定-使用者組-id(sgid)位,則有效使用者組id等於檔案所有者的gid,而不是實際使用者組id。
以上這些概念還是比較的抽象,那麼我就動手驗證一下就非常清楚了。使用者如下**寫乙個小的測試程式:
#include #include #include int main(void)這個程式非常簡單沒有什麼好說的。我們編譯這個程式生成a.out程式。通過上圖,我們可以看到:通過id命令看到當前登入使用者為simon,uid=1000,gid=1000。通過ls命令我們可以看出a.out程式沒有設定suid和sgid(可以參考我的博文
linux的特殊檔案許可權
,來明確怎樣通過ls檢視suid和sgid位的設定情況),所有者是simon,所有者阻也是simon。執行a.out我們發現有效使用者id等於實際使用者id(1000),有效使用者組id等於實際使用者組id(1000)。
你可能注意到a.out的所有者simon,組也是simon,和實際使用者,實際使用者組是一樣的,這樣測試下來上面的結果說服力不夠。下一步我們修改一下a.out所有者和組,再看結果。
發現結果和上面一樣,a.out程序的有效使用者id等於實際使用者id(1000),有效使用者組id等於實際使用者組id(1000)。
下面我們給a.out程式設定suid,看看會有什麼結果。
我們發現設定a.out程式的suid位之後,a.out程序的有效使用者id等於檔案所有者的uid(root的uid為0),有效使用者組id還是等於實際使用者組id(1000)。這樣程式就可以訪問只有root才能訪問的資源了。注意這樣的程式很危險,編寫這樣的程式一定要小心。
下面我們設定a.out的sgid,看看會有什麼結果。
我們發現設定a.out的sgid之後,a.out程序的有效使用者id等於實際使用者id(1000),有效使用者組id等於檔案所有者的使用者組id(root組gid等於0)。這樣a.out程序就可以訪問root組可以訪問的所有的資源了。
經過上面的描述想必大家對實際使用者id和有效使用者id有了乙個比較清晰的認識。請大家自行分析passwd命令的實際使用者id和有效使用者id(passwd需要訪問root許可權的資源/etc/passwd等),可以參考linux的特殊檔案許可權。
Linux程序的實際使用者ID和有效使用者ID
本人對unix下的程序的實際使用者id和有效使用者id一直都比較迷惑,沒有完全搞清楚。最近溫習apue 高階unix環境程式設計 終於對這兩個概念有了乙個清晰的認識,看來經典著作絕對需要溫習多遍,才能領略其中的奧秘。在unix程序中涉及多個使用者id和使用者組id,包括如下 1 實際使用者id和實際...
Linux程序的實際使用者ID和有效使用者ID
在unix程序中涉及多個使用者id和使用者組id,包括如下 1 實際使用者id和實際使用者組id 標識我是誰。也就是登入使用者的uid和gid,比如我的linux以simon登入,在linux執行的所有的命令的實際使用者id都是simon的uid,實際使用者組id都是simon的gid 可以用id命...
Linux程序的實際使用者ID和有效使用者ID
在unix程序中涉及多個使用者id和使用者組id,包括如下 1 實際使用者id和實際使用者組id 標識我是誰。也就是登入使用者的uid和gid,比如我的linux以simon登入,在linux執行的所有的命令的實際使用者id都是simon的uid,實際使用者組id都是simon的gid 可以用id命...