备注

在HP-UX和FreeBSD下,可以在中找到该原型。在Linux下,glibc从2.3.2版开始提供原型。

原始的Linux setresuid()和setresgid()系统调用仅支持16位用户和组ID。随后,Linux 2.4添加了支持32位ID的setresuid32()和setresgid32()。 glibc setresuid()和setresgid()包装函数透明地处理内核版本之间的差异。

C library/kernel differences

在内核级别,用户ID和组ID是每个线程的属性。但是,POSIX要求进程中的所有线程共享相同的凭据。 NPTL线程实现通过为更改过程UID和GID的各种系统调用提供包装函数来处理POSIX要求。这些包装函数(包括setresuid()和setresgid()的函数)采用基于信号的技术,以确保当一个线程更改凭据时,进程中的所有其他线程也更改其凭据。有关详细信息,请参见nptl(7)。

遵循规范

这些调用是非标准的;它们还会出现在HP-UX和某些BSD上。

语法

#定义_GNU_SOURCE / 参见feature_test_macros(7)/
#包括

int setresuid(uid_t ruid,uid_t euid,uid_t suid);
int setresgid(gid_t rgid,gid_t egid,gid_t sgid);

错误说明

EAGAIN
该调用将更改调用者的真实UID(即ruid与调用者的真实UID不匹配),但是分配必要的内核数据结构暂时失败。
EAGAIN
ruid与调用者的真实UID不匹配,并且此调用将使属于真实用户ID ruid的进程数超过调用者的RLIMIT_NPROC资源限制。从Linux 3.1开始,不再发生这种错误情况(但是功能强大的应用程序应检查该错误);请参阅execve(2)中对EAGAIN的描述。
EINVAL
目标用户或组ID中的一个或多个在此用户名称空间中无效。
EPERM
调用过程没有特权(在其用户名称空间中没有必要的功能),并且试图将ID更改为不允许的值。对于setresuid(),必要的功能是CAP_SETUID;对于setresgid(),它是CAP_SETGID。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

SETRESUID - Linux手册页

Linux程序员手册 第2部分
更新日期: 2017-09-15

版本

从Linux 2.1.44开始,这些调用在Linux下可用。

名称

setresuid,setresgid-设置真实,有效和已保存的用户或组ID

另外参见

getresuid(2),getuid(2),setfsgid(2),setfsuid(2),setreuid(2),setuid(2),功能(7),凭据(7),user_namespaces(7)

说明

setresuid()设置调用过程的真实用户ID,有效用户ID和保存的set-user-ID。

非特权进程可以将其实际UID,有效UID和已保存的设置用户ID更改为以下各项之一:当前实际UID,当前有效UID或当前已保存的设置用户ID。

特权进程(在Linux上,具有CAP_SETUID功能)可以将其实际UID,有效UID和已保存的set-user-ID设置为任意值。

如果参数之一等于-1,则相应的值不会更改。

无论对实际UID,有效UID和已保存的设置用户ID进行了什么更改,文件系统UID始终都设置为与(可能是新的)有效UID相同的值。

完全类似,setresgid()设置调用进程的实际GID,有效GID和已保存的set-group-ID(并始终将文件系统GID修改为与有效GID相同),但对非特权进程具有相同的限制。

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

注意:在某些情况下,即使调用者的UID为0,setresuid()也会失败;忽略检查setresuid()的失败返回是一个严重的安全错误。

日期:2019-08-20 17:59:21 来源:oir作者:oir