59. Solaris下究竟如何使用setuid/seteuid/setreuid
Q: 我被setuid/seteuid/setreuid搞疯了,到底怎么使用它们?
A: 下面是Solaris 7的setuid(2)手册页
系统调用 setuid(2)
名字
setuid、setegid、seteuid、setgid - 设置UID和GID
摘要
#include <sys/types.h>
#include <unistd.h>
int setuid ( uid_t uid 
;
int seteuid ( uid_t euid 
;
int setgid ( gid_t gid 
;
int setegid ( gid_t egid 
;
描述
seteuid()只设置EUID。如果当前EUID为0,形参euid任意指定。否则
形参euid应该是RUID、EUID、SUID之一。无论如何,最终只影响当前
EUID。
setegid()只设置EGID。如果当前EUID为0,形参egid任意指定。否则
形参egid应该是RGID、EGID、SGID之一。无论如何,最终只影响当前
EGID。
登录时,RUID、EUID、SUID设置成登录ID。
进程调用exec(2)执行一个程序文件,考虑两种情况:
a. 程序文件set-user-id,则相应进程EUID、SUID被设置成这个程序
文件的属主ID。
程序文件set-group-id,则相应进程EGID、SGID被设置成这个程
序文件的属组ID。
b. 程序文件没有set-user-id,则相应进程EUID、SUID不变。
程序文件没有set-group-id,则相应进程EGID、SGID不变。
如果当前EUID为0,任意调用setuid()同时设置RUID、EUID、SUID。
如果当前EUID为0,任意调用setgid()同时设置RGID、EGID、SGID。
如果当前EUID不为0,形参uid等于RUID或者SUID,调用setuid()后当
前EUID被设置成形参uid,RUID、SUID不受影响。
如果当前EUID不为0,形参gid等于RGID或者SGID,调用setgid()后当
前EGID被设置成形参gid,RGID、SGID不受影响。
返回值
0 成功
-1 失败,errno被设置
错误值
EINVAL 形参uid、gid等不在合法范围内
EPERM 当前EUID不为0,形参指定不符合前面描述
属性
___________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
| ____________________________|_____________________________|
| MT-Level | setuid() and setgid() and|
| | Async-Signal-Safe |
|_____________________________|_____________________________|
参看
intro(2)、exec(2)、getgroups(2)、getuid(2)、attributes(5)
stat(5)
A: 下面是Solaris 7的setreuid(2)手册页
系统调用 setreuid(2)
名字
setreuid - 设置RUID、EUID
摘要
#include <unistd.h>
int setreuid ( uid_t ruid, uid_t euid 
;
描述