用户ID与组ID
Table of Contents
1 实际ID,有效ID与保存的设置ID
2 更改用户/组ID函数
#include <unistd.h> int setuid(uid_t uid); int setgid(gid_t gid); /* 同时设置实际/有效ID */ int setreuid(uid_t ruid,uid_t euid); int setregid(gid_t rgid,gid_t egid); /* 只更改有效ID */ int seteuid(uid_t uid); int setegid(gid_t gid);
- 若进程具有root权限,则setuid函数 将实际用户ID,有效用户ID及保存的设置用户ID设置为uid
- 若root权限进程要只设置实际用户ID或有效用户ID,则需使用setreuid/seteuid函数.
- 若进程无root权限,但uid等于 实际用户ID或保存的设置用户ID,则setuid只将 有效用户ID 设置为uid. 不改变实际用户ID和保存的设置用户ID
- 若上面条件都不满足,则将errno设置为EPERM,并返回-1
2.1 关于设置用户ID的规则说明
- 只有超级用户进程可以更改实际用户ID
- 只有当程序文件设置了`设置用户ID位'时,exec函数才会设置有效用户ID为程序文件的所有者. 否则有效用户ID为实际用户ID.
- `保存的设置用户ID'是由exec函数复制`有效用户ID'得来的. 即这两个用户ID的值在刚exec时是一致的,但有效用户ID可能在后期被设置为实际用户ID.
- 非超级用户进程,其实际用户ID和`保存的设置用户ID'一经exec设置完毕后,就不能更改. 能更改的只有有效用户ID.
- 若非root权限,当设置有效用户ID时,uid的值只能为实际用户ID或`保存的设置用户ID'
2.2 关于设置组ID的规则说明
- 组ID的规则类似用户ID的规则
- 附加组ID不受setgid,seetregid或setegid函数的影响.