真正的UID,有效的UID,以及一些系统甚至有一个"保存的UID".所有这些的目的是什么,特别是最后一个?
每个UNIX进程都有3个与之关联的UID.超级用户权限是UID = 0.
真正的UID
这是创建此过程的用户/进程的UID.仅当正在运行的进程具有EUID = 0时才能更改它.
有效的UID
此UID用于评估进程执行特定操作的权限.如果EUID!= 0,则可以将EUID更改为RUID或SUID.如果EUID = 0,则可以将其更改为任何内容.
保存的UID
如果运行set-UID位设置的可执行文件,则生成的运行进程将以运行它的真实用户的真实UID以及可执行文件所有者的有效且保存的UID开始.如果进程调用setuid()或seteuid()来更改其有效UID,则由于保存的UID,它们仍然可以再次恢复其原始权限.如果未设置set-UID位,则SUID将是RUID.
真正的uid是启动进程的用户的id.
有效的uid通常与真实的uid相同.仅在以下情况下有所不同:
可执行文件设置了set-uid位,可执行文件所有者与调用它的用户不同
或者如果set-uid进程调用setuid(2).如果进程具有超级用户权限,则允许setuid(2)的任何参数(但是所有*-uids都设置为相同的值); 否则,可以使用real-uid或effective-uid或saved-uid调用setuid(2).
saved-uid是进程启动时的有效uid,它被保存以便作为各种set*uid系统调用的参数被允许.
请注意,具有超级用户权限的进程调用setuid(2)来更改其有效uid也将使实际uid和已保存的uid更改为相同的值,因此应使用非POSIX seteuid(2).
以上所有也适用于(实际有效的)组ID.