参考:https://www.cnblogs.com/bwangel23/p/4225818.html
一、Linux 中的UID 1.1 每个进程的三个UID值内核为每个进程维护的三个UID值。这三个UID分别是RUID(Real UID,实际用户ID)、EUID(Effective UID,有效用户ID)、SUID(Saved Set-user-ID,保存的设置用户ID)。
- RUID:我们当前以哪个用户登录,我们运行程序产生进程的RUID就是这个用户的UID。
- EUID:指当前进程实际以哪个UID来运行。一般情况下EUID等于RUID;但如果进程对应的可执行文件具有SUID权限(也就是rws的s),那么进程的EUID是可执行文件的所有者的UID。
- SUID:EUID的一个副本,与SUID权限有关。
以passwd这个可执行文件为例。
password文件的权限为:-rwsr-xr-x
passwd的所有者是root,但是其他用户对于passwd也有执行权限,并且passwd自身具有SUID权限(rws的s)。
那么,当非root用户执行passwd这个可执行文件的时候,产生的进程的EUID,就是root用户的UID。换言之,这种情况下,产生的进程,实际以root用户的ID来运行二进制文件。
需要说明的是,SUID权限具有时效性:仅在执行该文件的过程中有效。
二、setuid函数函数原型:int setuid(uid_t uid);
在Linux中, setuid(uid)函数的执行步骤为:
(1)如果由Root权限进程(EUID为0的进程)调用,则将进程的RUID,EUID和SUID都设置为uid,返回0
(2)如果由普通权限进程调用,且uid等于RUID或uid等于SUID,则将进程的EUID设置为uid,返回0
(3)如果由普通权限进程调用,且uid不等于RUID或SUID,则设置errno为EPERM,并返回-1(表示执行失败)
上文中,执行password的进程,EUID是password的所有者的UID,也就是root用户的UID,也就是0。所以,属于情况(1)。
su文件同样是-rwsr-xr-x权限。所以,安卓中,普通进程通过Runtime.getRuntime().exec(“su”),发起一个shell进程,去执行su的时候,同样属于情况(1)。
三、getuid和giteuid函数getuid返回当前进程的RUID
geteuid返回当前用户的EUID
参见:https://blog.csdn.net/qq_39441603/article/details/124996277



