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 函数的影响