linux下进程的实际用户ID(有效组)和有效用户ID(有效组ID)

  实际用户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是我自己编写的测试程序,只是一个无限循环代码如下:

1 #include <stdio.h>
2 
3 int main(){
4         while(1){
5                 ;       //空语句用于实现无限循环  
6         }
7         return 0;
8 }

  用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。

 

posted @ 2015-12-11 20:15  soiios  阅读(6478)  评论(1编辑  收藏  举报