乙個系統啟動後,使用者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命...