与进程有关的 ID 大概有 6 种左右,如下图所示
======================================================
进程实际用户ID:就是创建此进程的用户的 ID;
进程有效用户ID:是进程用来评定对系统资源访问权限的用户 ID;
进程创建新文件的时候新文件的所有者被设置成进程的有效用户。
保存的设置用户ID:就是用来备份进程有效用户 ID 的;(后面的笔记再详细介绍)
通常情况下,进程的实际用户ID和有效用户ID是相同的。但是如果可执行文件的set-user-id文件权限位被设置了,那么实际用户ID和有效用户ID可能会是不一样的。实际用户ID仍然是创建该进程的用户ID,但是有效用户ID将会变成该可执行文件的所有者用户的ID。
比如说,有一个可执行程序的文件所有者是root用户,而我现在处于普通用户frank下,此时我运行该程序,那么进程的实际用户ID就是frank的ID,而有效用户ID则会变成程序文件的所有者root用户的ID。
典型就有passwd可执行文件,普通用户可以执行这个命令修改自己的密码,其实就是修改/etc/passwd这个文件的内容,而此文件只有root用户才有写权限,原因就是passwd设置了set-user-id位,当普通用户指向passwd命令时,进程有效用户变成了passwd文件的所有者即root用户,故才可以对/etc/passwd文件进行写操作。
前面说的前提是文件的setuid位为被设置了,这个权限位也存在于struct inode结构体中的i_mode成员中。在shell命令中使用chmod命令可以来设置set-user-id位,设置方法为chmod u+s 文件名。
同样对于进程实际用户组ID和进程有效用户组ID也是类似的。