linux程序的使用者ID,有效ID,儲存的設定ID

2021-04-29 07:14:48 字數 1256 閱讀 9801

乙個系統啟動後,使用者login登入後,會產生乙個使用者程序,該程序和其它程序一樣有7個id值:實際使用者id,有效使用者id,儲存的設定id(set-user-id),實際組id,有效組id,新增組id以及儲存的設定組id。這裡只說uid,這三個id都來自登入名。至此我們有了乙個使用者shell程序,當執行程式時,通常由fork+exec函式來做。由使用者程序fork出來的子程序將繼承父程序的uid和euid。子程序再呼叫exec(),這時,若程式的設定id位沒有被置位,那麼這個子程序的uid和euid保持不變,而儲存的設定id從euid複製。如果程式的設定id位被置位了,那麼子程序的實際uid保持不變,euid設定為程式檔案的uid,儲存的設定id從euid複製。程式的設定id位只能由所有者去置位,特權使用者可以置位所有的程式。  

下面以apue上的例子access.c來說明一下設定id位的作用。

#include   

#include   

#include    "ourhdr.h"int

main(int argc, char *argv)

假定該原始檔是以renshui身份建立的。那麼我們執行程式後,程序的

uid=renshui

euid=renshui

set-user-id=renshui  

如果我們為程式傳入的引數是該原始檔access.c,則access函式可以讀該檔案,因為程序的uid等於檔案的所有者id;open函式也可以讀該檔案,因為程序的euid等於檔案的所有者id。如果我們為程式傳入的引數是 /etc/shadow,該檔案的mode為

-r-------- 1 root root 1325 03-16 18:29 /etc/shadow  

也就是說只有root可以去讀。我們用普通登入名去執行access程式,則無論是access還是open都無法讀該/etc/shadow檔案。我們切換到超級使用者  

$ su  成為超級使用者

# chown root access 將檔案使用者id改為root

# chmod u+s access開啟set-user-id

# exit恢復為正常使用者  

我們再去執行access去訪問/etc/shadow,則該程序的  

uid=renshui

euid=root

set-user-id=root  

用access嘗試去讀仍然不可以,因為核心是以程序的uid執行訪問許可權測試的。用open去讀就可以了,因為核心是以程序的euid執行訪問許可權測試的,這時euid等於/etc/shadow的所有者root。

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命...