SETREUID - Linux手册页
Linux程序员手册 第2部分
更新日期: 2017-09-15
名称
setreuid,setregid-设置真实和/或有效的用户或组ID
语法
#包括
#包括
int setreuid(uid_t ruid,uid_t euid);
int setregid(gid_t rgid,gid_t egid);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
setreuid(),setregid():
- _XOPEN_SOURCE>= 500 || / *自glibc 2.19起:* / -_DEFAULT_SOURCE || / * Glibc版本
说明
setreuid()设置调用过程的真实有效用户ID。
为真实或有效用户ID提供值-1会强制系统使该ID保持不变。
非特权进程只能将有效用户ID设置为真实用户ID,有效用户ID或保存的设置用户ID。
非特权用户只能将真实用户ID设置为真实用户ID或有效用户ID。
如果设置了真实用户ID(即ruid不为-1)或有效用户ID设置为不等于先前的真实用户ID的值,则保存的设置用户ID将被设置为新的有效用户。 ID。
完全类似,setregid()设置调用过程的真实有效的组ID,以上所有内容均以"组"而不是"用户"保存。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
注意:在某些情况下,即使调用者的UID为0,setreuid()也会失败。忽略检查setreuid()的失败返回是一个严重的安全错误。
错误说明
- EAGAIN
- 该调用将更改调用者的真实UID(即ruid与调用者的真实UID不匹配),但是分配必要的内核数据结构暂时失败。
- EAGAIN
- ruid与调用者的真实UID不匹配,并且此调用将使属于真实用户ID ruid的进程数超过调用者的RLIMIT_NPROC资源限制。从Linux 3.1开始,不再发生这种错误情况(但是功能强大的应用程序应检查该错误);请参阅execve(2)中对EAGAIN的描述。
- EINVAL
- 目标用户或组ID中的一个或多个在此用户名称空间中无效。
- EPERM
- 调用过程没有特权(在Linux上,其用户名称空间不具备必需的功能:对于setreuid(),为CAP_SETUID;对于setregid(),为CAP_SETGID),并且除了(i)交换外有效用户(组)ID和真实用户(组)ID,或(ii)将一个设置为另一个的值,或(iii)将有效用户(组)ID设置为已保存的设置用户ID的值(保存的组ID)已指定。
遵循规范
POSIX.1-2001,POSIX.1-2008、4.3BSD(setreuid()和setregid()首次出现在4.2BSD中)。
备注
从Linux 1.1.37(1.1.38)开始,可以将有效用户(组)ID设置为已保存的set-user-ID(已保存的set-group-ID)。
POSIX.1并未指定Linux允许用于非特权进程的所有UID更改。对于setreuid(),有效用户ID可以与真实用户ID或保存的set-user-ID相同,并且未指定无特权进程是否可以将真实用户ID设置为真实用户ID(有效用户) ID,或保存的设置用户ID。对于setregid(),可以将真实组ID更改为已保存的组ID的值,并且可以将有效组ID更改为实际组ID或已保存的组ID的值。允许更改ID的确切详细信息因实现而异。
POSIX.1没有说明这些调用对保存的set-user-ID和保存的set-group-ID的影响。
原始的Linux setreuid()和setregid()系统调用仅支持16位用户和组ID。随后,Linux 2.4添加了支持32位ID的setreuid32()和setregid32()。 glibc setreuid()和setregid()包装函数透明地处理内核版本之间的差异。
C library/kernel differences
在内核级别,用户ID和组ID是每个线程的属性。但是,POSIX要求进程中的所有线程共享相同的凭据。 NPTL线程实现通过为更改过程UID和GID的各种系统调用提供包装函数来处理POSIX要求。这些包装函数(包括setreuid()和setregid()的函数)采用基于信号的技术,以确保当一个线程更改凭据时,进程中的所有其他线程也更改其凭据。有关详细信息,请参见nptl(7)。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。