来自APUE
- 如果进程具有超级用户权限,则setuid函数将真实用户ID、有效用户ID和保存的set-user-ID设置为uid。
- 如果进程没有超级用户权限,但 uid 等于真实用户 ID 或保存的 set-user-ID,则 setuid 仅将有效用户 ID 设置为 uid。真实用户ID和保存的设置用户ID不会改变。
- 如果这两个条件都不成立,则 errno 设置为 EPERM 并返回 -1。
“进程具有超级用户权限”是什么意思?
这是否意味着进程的真实用户 ID 为 0,即 root?
这是否意味着进程的有效用户 ID 为 0,即 root?
谢谢。
答案1
在 POSIX 中,如果进程具有超级用户权限,则有效的用户 ID 为 0。
(一些 Unix 风格的系统有不同的机制;例如,在 Linux 上,默认的访问控制系统也考虑功能,您可以创建一个 setuid 二进制文件,它将以 root 有效用户运行,但没有功能,因此无能为力。看联机setuid
帮助页.)
APUE正在描述指定的行为setuid
。上下文以用户 ID 设置的方式给出exec
:如果可执行文件setuid
设置了该位,并且在未禁用的情况下安装了其文件系统setuid
,则运行它会产生exec
一个进程,该进程的有效用户是文件的所有者,其真实和保存的用户是调用用户。
如果setuid
使用有效的 root 用户调用,它将替换所有用户 ID;否则它只会替换有效的 id。这最终会令人困惑......这种行为的原因在 POSIX 规范的基本原理中给出:login
并且su
需要能够以不可撤销的方式更改用户 id,而唯一的方法就是替换所有 id 。