UID、EUID、GID和EGID
Linux中id真是太多了进程有pid,然后用户还有UID这种,真是有点绕。
在Linux当中一个进程(程序)拥有四个ID:真实用户UID
、有效用户EUID
、真实组GID
和有效组EGID
。
这里以真实用户UID
和有效用户EUID
为例,真实组GID
和有效组EGID
道理是相同的。
EUID
存在的目的是方便资源访问:它使得运行程序的用户拥有该程序的有效用户的权限(太过官方这种说法感觉)。EUID
确定进程对某些资源和文件的访问权限。在大多数情况下,进程的UID
和EUID
是一样的,但是对于一些程序如su
、passwd
这种set-user-id
程序,它们有可能是不相同的。对于set-user-id
程序而言,程序的EUID
会变成程序的所有者的UID
,也就是说程序执行时,是以程序的所有者身份进行运行的。
以passwd
为例。passwd
允许用户修改自己的登录密码,这个程序的所有者是root
,passwd
权限中有s
,表明这是一个set-user-id
程序。passwd
命令需要修改/etc/shadow
文件,对于/etc/shadow
文件,普通用户是不可写(只有读权限)的,那么用户怎么能够通过passwd
修改自己的密码呢,set-user-id
程序的标志s
就起到了作用,它在程序运行时将EUID
会变成程序的所有者的UID
,那么程序有效的用户就会变成程序的所有者,在这里是root
用户,理所当然的可以进行/etc/shadow
文件的修改。
再比如su
程序允许任何用户都可以使用它来修改自己的账户信息,但修改账户时程序不得不访问文件/etc/passwd
文件,而访问该文件是需要root
权限的。那么以普通用户身份启动的su
程序如何能访问/etc/passwd
文件呢?
su
程序的所有者是root
,并且它被设置了set-user-id
标志。和上面passwd
一样,set-user-id
标志表示任何普通用户运行su
程序时,其有效用户就是该程序的所有者root
。
获取和设置真实用户UID
、有效用户EUID
、真实组GID
和有效组EGID
的函数如下
1 |
|
为了测试上面所说,我们先创建一个普通用户bugcat
,目前已经有普通用户ubuntu
。
可以看到bugcat
的uid是1002
我们写下读取程序uid
和euid
的代码如下:
1 |
|
将其编译一下,然后查看查看文件属性,再运行程序,可以看到uid
和euid
输出相同,表示真实用户和有效用户都是ubuntu
接着再将程序的所有者改为root
,再加上s
权限,再运行程序,可以看到uid
和euid
输出不相同,表示真实用户是ubuntu
,有效用户是root
(符合set-user-id
程序特点)
然后将程序的所有者改为bugcat
(s权限不知道为啥自动取消了),再加上s
权限,再运行程序,可以看到uid
和euid
输出不相同,表示真实用户是ubuntu
,有效用户是bugcat
最后我们去掉s
权限,运行程序,可以看到uid
和euid
输出相同,表示真实用户和有效用户都是ubuntu
,也从反面说明s
权限的作用。