實際用戶ID(實際組ID):標識當前用戶(所屬組)是誰,當用戶登陸時取自口令文件。
有效用戶ID(有效組ID):用來決定我們(當前進程)對文件的訪問權(即實際該進程的是以那個用戶運行的)。
一般情況下,進程的有效用戶ID等於進程的實際用戶ID,進程的有效用戶組ID等於進程的實際用戶組ID。
但是當可執行程序文件的文件模式(st_mode)中設置了“設置-用戶-ID(set_user_id)位”時,進程的有效用戶ID等於該可執行文件的擁有者ID。
同樣的如果可執行文件的文件模式(st_mode)中設置了“設置-組-ID(set-group-d)位”時,進程的有效用戶組ID等於該可執行文件的擁有組ID例如:
現在有兩個可執行文件test,passwd,其中passwd是linux系統自帶的修改密碼程序(linux下在/usr/bin目錄下),test是我自己編寫的測試程序,只是一個無限循環代碼如下:
#include <stdio.h>
int main(){
while(1){
; //空語句用於實現無限循環
}
return 0;
}
用ls -l查看這兩個文件的詳細信息如下:
從圖中可以看到test文件的擁有ID和組ID都爲zzg(我的登陸賬號),passwd文件的擁有者ID和組ID都爲root,且由命令提示符可以看出現在我是以zzg用戶登陸的,或者用命令id來查看shell下當前用戶的用戶ID和組ID:
即當前的實際用戶ID和實際用戶組ID都爲zzg。
現在分別運行test程序和passwd程序,然後在另一個終端下用ps命令查看test的有效ID和有效ID,如下:
運行程序
ps輸出
由圖可知
test實際是以用戶ID:zzg,組ID:zzg來運行的,即對PID=8442的進程來說:
它的實際用戶ID爲zzg
它的有效用戶ID爲zzg
它的實際用戶組ID爲zzg
它的有效用戶組ID爲zzg
passwd實際是以用戶ID:root,組ID:zzg來運行的,即對PID=8444的進程來說:
它的實際用戶ID爲zzg(由於是當前用戶是zzg)
它的有效用戶ID爲root
它的實際用戶組ID爲zzg
它的有效用戶組ID爲zzg
下面讓我們再來看這兩個文件的詳細信息
從圖中可以看出passwd的設置了“設置-用戶-id”位(第四位上的‘s’,爲設置該爲的標誌),但是沒有設置“設置-組-id”位,
所以會出現以上的情況,即對PID=8444的進程來說,有效用戶ID等於passwd的擁有者ID(root),有效用戶組ID等於運行該程序的實際用戶組ID(zzg)。
同樣可以看出test的"設置-用戶-ID"位,"設置-組-ID"位都沒有設置,所以對PID=8442的進程來說,有效用戶ID和有效用戶組ID分別等於運行該程序的實際用戶ID,實際用戶組ID。