
178
|
第五章
以 HP-UX 的手法變更用戶和群組的識別碼
你可能會覺得情況越來越混亂,就連 HP-UX(Hewlett-Packard 的 Unix 系統)也提供了
自己的機制,以便用於設定一個行程的用戶和群組識別碼。Linux 隨後也提供了這些介
面,如果你想要維持 HP-UX 的移植性,這會很有用:
#define _GNU_SOURCE
#include <unistd.h>
int setresuid (uid_t ruid, uid_t euid, uid_t suid);
int setresgid (gid_t rgid, gid_t egid, gid_t sgid);
setresuid()
可用於把真實、有效以及暫存的用戶識別碼分別設定成
ruid
、
euid
以及
suid
。若把任何參數值設定成
-1
,則相對應的用戶識別碼會維持不變。
root
用戶可以把任何的用戶識別碼設定成任何值。非 root 用戶可以把任何的用戶識別碼
設定成當前之真實、有效或暫存的用戶識別碼。執行成功時,
setuid()
會傳回
0
。發生
錯誤時,則會傳回
-1
並把
errno
設定成下面其中一個值:
EAGAIN
uid
與真實用戶識別碼不相符,而且把真實用戶識別碼設定成
uid
,會使得用戶逾越
其
NPROC
rlimit(用於指定一個用戶所能擁有之行程的數目)。
EPERM
用戶不是
root
,而且企圖把真實、有效或暫存的用戶識別碼設定成與當前之真實、
有效或暫存的用戶識別碼不相符的值。
前面的討論同樣適用於群組—僅需要把
setresuid() ...