这段时间在看《Linux系统编程》,看到好几个对用户ID设置的接口,然后就对实际用户和有效用户
感觉到疑惑,在查询弄明白后,将在下面介绍。
从理论上介绍一下两者区别
实际用户
实际用户ID是指运行这个进程的用户uid。这个用户uid会被设置为父进程的实际用户ID,并且在exec
系统调用中都不会发生改变。一般情况下,登录进程会将用户登录那个shell的实际用户ID设置为
登录用户的uid,并且这个用户所有进程的实际用户ID都会继承这个值。 超级用户可能会把实际用户
ID设置修改为任意值,但是其他用户不可以。
有效用户
有效用户ID是当前进程所使用的用户ID。 权限认证一般是使用这个值。 初始时,这个ID等于
实际用户ID。
改变uid/gid
1 |
|
调用setuid()会设置当前进程的有效用户ID。root用户可以为uid提供任何值;非root用户只允许
将实际用户ID和保留用户ID设置为uid。
获得uid/gid
1 |
|
使用getuid和getgid可以分别获得当前进程的uid和gid。
通过实例来展现uid/euid区别
1 |
|
编译运行的结果:
1 | hao@hao1:~/linux/5.6$ ./uid |
第一次运行的时候,使用的是普通用户,uid=1000,gid=1000,由于没有使用setgid对gid进行改变,
所以uid = gid。第二次运行的时候,使用的是超级权限(root),所以uid=0,gid=0。
特别说明
- 有效用户ID(euid)代表它的属主,限制进程的权限。
- 在没有seteuid的情况下,uid = euid,guid同理。
- 当进程以root权限调用setuid()后,root权限会被丢弃,所以root权限下,使用setuid()更加安全。