这段时间在看《Linux系统编程》,看到好几个对用户ID设置的接口,然后就对实际用户和有效用户
感觉到疑惑,在查询弄明白后,将在下面介绍。

从理论上介绍一下两者区别

实际用户

实际用户ID是指运行这个进程的用户uid。这个用户uid会被设置为父进程的实际用户ID,并且在exec
系统调用中都不会发生改变。一般情况下,登录进程会将用户登录那个shell的实际用户ID设置为
登录用户的uid,并且这个用户所有进程的实际用户ID都会继承这个值。
超级用户可能会把实际用户
ID设置修改为任意值,但是其他用户不可以。

有效用户

有效用户ID是当前进程所使用的用户ID。 权限认证一般是使用这个值。 初始时,这个ID等于
实际用户ID。

改变uid/gid

1
2
3
4
5
#include <sys/types.h>
#include <unistd.h>

int setuid (uid_t uid);
int setgid (guid_t guid);

调用setuid()会设置当前进程的有效用户ID。root用户可以为uid提供任何值;非root用户只允许
将实际用户ID和保留用户ID设置为uid。

获得uid/gid

1
2
3
4
5
#include <sys/types.h>
#include <unistd.h>

uid_t getuid (void);
gid_t getgid (void);

使用getuid和getgid可以分别获得当前进程的uid和gid。

通过实例来展现uid/euid区别

1
2
3
4
5
6
7
8
9
10
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char const *argv[]) {
printf("uid=%d\n", getuid());
printf("gid=%d\n", getgid());

return 0;
}

编译运行的结果:

1
2
3
4
5
6
hao@hao1:~/linux/5.6$ ./uid
uid=1000
gid=1000
hao@hao1:~/linux/5.6$ sudo ./uid
uid=0
gid=0

第一次运行的时候,使用的是普通用户,uid=1000,gid=1000,由于没有使用setgid对gid进行改变,
所以uid = gid。第二次运行的时候,使用的是超级权限(root),所以uid=0,gid=0。

特别说明

  • 有效用户ID(euid)代表它的属主,限制进程的权限。
  • 在没有seteuid的情况下,uid = euid,guid同理。
  • 当进程以root权限调用setuid()后,root权限会被丢弃,所以root权限下,使用setuid()更加安全。

参考源