Linux獲取當前用戶信息函數


轉自:http://net.pku.edu.cn/~yhf/linux_c/function/07.html 

 




endgrent(關閉組文件)
相關函數
getgrent,setgrent
表頭文件
#include<grp.h>
#include<sys/types.h>
定義函數
void endgrent(void);
函數說明
endgrent()用來關閉由getgrent()所打開的密碼文件。
返回值
 
附加說明
 
范例
請參考getgrent()與setgrent()。
 

 

endpwent(關閉密碼文件)
相關函數
getpwent,setpwent
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
void endpwent(void);
函數說明
endpwent()用來關閉由getpwent()所打開的密碼文件。
返回值
 
附加說明
 
范例
請參考getpwent()與setpwent()。
 

 

endutent(關閉utmp 文件)
相關函數
getutent,setutent
表頭文件
#include<utmp.h>
定義函數
void endutent(void);
函數說明
endutent()用來關閉由getutent所打開的utmp文件。
返回值
 
附加說明
 
范例
請參考getutent()。
 

 

fgetgrent(從指定的文件來讀取組格式)
相關函數
fgetpwent
表頭文件
#include<grp.h>
#include<stdio.h>
#include<sys/types.h>
定義函數
struct group * getgrent(FILE * stream);
函數說明
fgetgrent()會從參數stream指定的文件讀取一行數據,然后以group結構將該數據返回。參數stream所指定的文件必須和、etc/group相同的格式。group結構定義請參考getgrent()。
返回值
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。
范例
#include <grp.h>
#include<sys/types.h>
#include<stdio.h>
main()
{
struct group *data;
FILE *stream;
int i;
stream = fopen("/etc/group", "r");
while((data = fgetgrent(stream))!=0){
i=0;
printf("%s :%s:%d :", data->gr_name,data->gr_passwd,data->gr_gid);
while (data->gr_mem[i])printf("%s,",data->gr_mem[i++]);
printf("\n");
}
fclose(stream);
}
執行
root:x:0:root,
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8
kmem:x:9
wheel:x:10:root
mail:x:12:mail
news:x:13:news
uucp:x:14:uucp
man:x:15
games:x:20
gopher:x:30
dip:x:40:
ftp:x:50
nobody:x:99:
 

 

fgetpwent(從指定的文件來讀取密碼格式)
相關函數
fgetgrent
表頭文件
#include<pwd.h>
#include<stdio.h>
#include<sys/types.h>
定義函數
struct passwd * fgetpwent(FILE *stream);
函數說明
fgetpwent()會從參數stream指定的文件讀取一行數據,然后以passwd結構將該數據返回。參數stream所指定的文件必須和/etc/passwd相同的格式。passwd結構定義請參考getpwent()。
返回值
返回passwd結構數據,如果返回NULL則表示已無數據,或有錯誤發生。
范例
#include<pwd.h>
#include<sys/types.h>
main()
{
struct passwd *user;
FILE *stream;
stream = fopen("/etc/passwd", "r");
while((user = fgetpwent(stream))!=0){
printf("%s:%d:%d:%s:%s:%s\n",user->pw_name,user->pw_uid,user->pw_gid,user->pw_gecos,user->pw_dir,user->pw_shell);
}
}
執行
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:
daemon:2:2:daemon:/sbin:
adm:3:4:adm:/var/adm:
lp:4:7:lp:/var/spool/lpd:
sync:5:0:sync:/sbin:/bin/sync
shutdown:6:0:shutdown:/sbin:/sbin/shutdown
halt:7:0:halt:/sbin:/sbin/halt
mail:8:12:mail:/var/spool/mail:
news:9:13:news:var/spool/news
uucp:10:14:uucp:/var/spool/uucp:
operator:11:0:operator :/root:
games:12:100:games:/usr/games:
gopher:13:30:gopher:/usr/lib/gopher-data:
ftp:14:50:FTP User:/home/ftp:
nobody:99:99:Nobody:/:
xfs:100:101:X Font Server: /etc/Xll/fs:/bin/false
gdm:42:42:/home/gdm:/bin/bash
kids:500:500: : /home/kids:/bin/bash
 

 

getegid(取得有效的組識別碼)
相關函數
getgid,setgid,setregid
表頭文件
#include<unistd.h>
#include<sys/types.h>
定義函數
gid_t getegid(void);
函數說明
getegid()用來取得執行目前進程有效組識別碼。有效的組識別碼用來決定進程執行時組的權限。返回值返回有效的組識別碼。
范例
main()

printf("egid is %d\n",getegid());
}
執行
egid is 0 /*當使用root身份執行范例程序時*/
 

 

geteuid(取得有效的用戶識別碼)
相關函數
getuid,setreuid,setuid
表頭文件
#include<unistd.h>
#include<sys/types.h>
定義函數
uid_t geteuid(void)
函數說明
geteuid()用來取得執行目前進程有效的用戶識別碼。有效的用戶識別碼用來決定進程執行的權限,借由此改變此值,進程可以獲得額外的權限。倘若執行文件的setID位已被設置,該文件執行時,其進程的euid值便會設成該文件所有者的uid。例如,執行文件/usr/bin/passwd的權限為-r-s--x--x,其s 位即為setID(SUID)位,而當任何用戶在執行passwd 時其有效的用戶識別碼會被設成passwd 所有者的uid 值,即root的uid 值(0)。
返回值
返回有效的用戶識別碼。
范例
main()

printf ("euid is %d \n",geteuid());
}
執行
euid is 0 /*當使用root身份執行范例程序時*/
 

 

getgid(取得真實的組識別碼)
相關函數
getegid,setregid,setgid
表頭文件
#include<unistd.h>
#include<sys/types.h>
定義函數
gid_t getgid(void);
函數說明
getgid()用來取得執行目前進程的組識別碼。
返回值
返回組識別碼
范例
main()
{
printf(“gid is %d\n”,getgid());
}
執行
gid is 0 /*當使用root身份執行范例程序時*/
 

 

getgrent(從組文件中取得賬號的數據)
相關函數
setgrent,endgrent
表頭文件
#include<grp.h>
#include <sys/types.h>
定義函數
struct group *getgrent(void);
函數說明
getgrent()用來從組文件(/etc/group)中讀取一項組數據,該數據以group 結構返回。第一次調用時會取得第一項組數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。
struct group{
char *gr_name; /*組名稱*/
char *gr_passwd; /* 組密碼*/
gid_t gr_gid; /*組識別碼*/
char **gr_mem; /*組成員賬號*/
}
返回值
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。
附加說明
getgrent()在第一次調用時會打開組文件,讀取數據完畢后可使用endgrent()來關閉該組文件。
錯誤代碼
ENOMEM 內存不足,無法配置group結構。
范例
#include<grp.h>
#include<sys/types.h>
main()
{
struct group *data;
int i;
while((data= getgrent())!=0){
i=0;
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);
while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]);
printf(“\n”);
}
endgrent();
}
執行
root:x:0:root,
bin:x:1:root,bin,daemon,
daemon:x:2:root,bin,daemon,
sys:x:3:root,bin,adm,
adm:x:4:root,adm,daemon
tty:x:5
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8
kmem:x:9:
wheel:x:10:root
mail:x:12:mail
news:x:13:news
uucp:x:14:uucp
man:x:15:
games:x:20
gopher:x:30
dip:x:40
ftp:x:50
nobody:x:99
 

 

getgrgid(從組文件中取得指定gid 的數據)
相關函數
fgetgrent,getgrent,getgrnam
表頭文件
#include<grp.h>
#include<sys/types.h>
定義函數
strcut group * getgrgid(gid_t gid);
函數說明
getgrgid()用來依參數gid指定的組識別碼逐一搜索組文件,找到時便將該組的數據以group結構返回。group結構請參考getgrent()。
返回值
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。
范例
/* 取得gid=3的組數據*/
#include<grp.h>
#include<sys/types.h>
main()
{
strcut group *data;
int i=0;
data = getgrgid(3);
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);
while(data->gr_mem[i])printf(“%s ,”,data->mem[i++]);
printf(“\n”);
}
執行
sys:x:3:root,bin,adm
 

 

getgrnam(從組文件中取得指定組的數據)
相關函數
fgetgrent,getrent,getgruid
表頭文件
#include<grp.h>
#include<sys/types.h>
定義函數
strcut group * getgrnam(const char * name);
函數說明
getgrnam()用來逐一搜索參數那么指定的組名稱,找到時便將該組的數據以group結構返回。group 結構請參考getgrent()。
返回值
返回group結構數據,如果返回NULL則表示已無數據,或有錯誤發生。
范例
/* 取得adm的組數據*/
#include<grp.h>
#include<sys/types.h>
main()
{
strcut group * data;
int i=0;
data = getgrnam(“adm”);
printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data->gr_gid);
while(data->gr_mem[i])printf(“%s,”,data->gr_mem[i++]);
printf(“\n”);
}
執行
adm:x:4:root,adm,daemon
 

 

getgroups(取得組代碼)
相關函數
initgroups,setgroup,getgid,setgid
表頭文件
#include<unistd.h>
#include<sys/types.h>
定義函數
int getgroups(int size,gid_t list[]);
函數說明
getgroup()用來取得目前用戶所屬的組代碼。參數size為list〔〕所能容納的gid_t 數目。如果參數size 值為零,此函數僅會返回用戶所屬的組數。
返回值
返回組識別碼,如有錯誤則返回-1。
錯誤代碼
EFAULT 參數list數組地址不合法。EINVAL 參數size值不足以容納所有的組。
范例
#include<unistd.h>
#include<sys/types.h>
main()
{
gid_t list[500];
int x,i;
x = getgroups(0.list);
getgroups(x,list);
for(i=0;i<x;i++)
printf(“%d:%d\n”,i,list[i]);
}
執行
0:00
1:01
2:02
3:03
4:04
5:06
6:10
 

 

getpw(取得指定用戶的密碼文件數據)
相關函數
getpwent
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
int getpw(uid_t uid,char *buf);
函數說明
getpw()會從/etc/passwd中查找符合參數uid所指定的用戶賬號數據,找不到相關數據就返回-1。所返回的buf字符串格式如下:賬號:密碼:用戶識別碼(uid):組識別碼(gid):全名:根目錄:shell
返回值
返回0表示成功,有錯誤發生時返回-1。
附加說明
1. getpw()會有潛在的安全性問題,請盡量使用別的函數取代。
2. 使用shadow的系統已把用戶密碼抽出/etc/passwd,因此使用getpw()取得的密碼將為“x”。
范例
#include<pwd.h>
#include<sys/types.h>
main()
{
char buffer[80];
getpw(0,buffer);
printf(“%s\n”,buffer);
}
執行
root:x:0:0:root:/root:/bin/bash
 

 

getpwent(從密碼文件中取得賬號的數據)
相關函數
getpw,fgetpwent,getpwnam,getpwuid,setpwent,endpwent
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
strcut passwd * getpwent(void);
函數說明
getpwent()用來從密碼文件(/etc/passwd)中讀取一項用戶數據,該用戶的數據以passwd 結構返回。第一次調用時會取得第一位用戶數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。
passwd 結構定義如下
struct passwd{
char * pw_name; /*用戶賬號*/
char * pw_passwd; /*用戶密碼*/
uid_t pw_uid; /*用戶識別碼*/
gid_t pw_gid; /*組識別碼*/
char * pw_gecos; /*用戶全名*/
char * pw_dir; /*家目錄*/
char * pw_shell; /* 所使用的shell路徑*/
};
返回值
返回passwd 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。
附加說明
getpwent()在第一次調用時會打開密碼文件,讀取數據完畢后可使用endpwent()來關閉該密碼文件。錯誤代碼ENOMEM 內存不足,無法配置passwd結構。
范例
#include<pwd.h>
#include<sys/types.h>
main()
{
struct passwd *user;
while((user = getpwent())!=0){
printf(“%s:%d:%d:%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,
user->pw_gecos,user->pw_dir,user->pw_shell);
}
endpwent();
}
執行
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin:
daemon:2:2:daemon:/sbin:
adm:3:4:adm:/var/adm:
lp:4:7:lp:/var/spool/lpd:
sync:5:0:sync:/sbin:/bin/sync
shutdown:6:0:shutdown:/sbin:/sbin/shutdown
halt:7:0:halt:/sbin:/sbin/halt
mail:8:12:mail:/var/spool/mail:
news:9:13:news:var/spool/news
uucp:10:14:uucp:/var/spool/uucp:
operator:11:0:operator :/root:
games:12:100:games:/usr/games:
gopher:13:30:gopher:/usr/lib/gopher-data:
ftp:14:50:FTP User:/home/ftp:
nobody:99:99:Nobody:/:
xfs:100:101:X Font Server: /etc/Xll/fs:/bin/false
gdm:42:42:/home/gdm:/bin/bash
kids:500:500: : /home/kids:/bin/bash
 

 

getpwnam(從密碼文件中取得指定賬號的數據)
相關函數
getpw,fgetpwent,getpwent,getpwuid
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
struct passwd * getpwnam(const char * name);
函數說明
getpwnam()用來逐一搜索參數name 指定的賬號名稱,找到時便將該用戶的數據以passwd結構返回。passwd結構請參考getpwent()。
返回值
返回passwd 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。
范例
/*取得root賬號的識別碼和根目錄*/
#include<pwd.h>
#include<sys/types.h>
main()
{
struct passwd *user;
user = getpwnam(“root”);
printf(“name:%s\n”,user->pw_name);
printf(“uid:%d\n”,user->pw_uid);
printf(“home:%s\n”,user->pw_dir);
}
執行
name:root
uid:0
home:/root
 

 

getpwuid(從密碼文件中取得指定uid 的數據)
相關函數
getpw,fgetpwent,getpwent,getpwnam
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
struct passwd * getpwuid(uid_t uid);
函數說明
getpwuid()用來逐一搜索參數uid 指定的用戶識別碼,找到時便將該用戶的數據以結構返回結構請參考將該用戶的數據以passwd 結構返回。passwd 結構請參考getpwent()。
返回值
返回passwd 結構數據,如果返回NULL 則表示已無數據,或者有錯誤發生。
范例
#include<pwd.h>
#include<sys/types.h>
main()
{
struct passwd *user;
user= getpwuid(6);
printf(“name:%s\n”,user->pw_name);
printf(“uid:%d\n”,user->pw_uid);
printf(“home:%s\n”,user->pw_dir);
}
執行
name:shutdown
uid:6
home:/sbin
 

 

getuid(取得真實的用戶識別碼)
相關函數
geteuid,setreuid,setuid
表頭文件
#include<unistd.h>
#include<sys/types.h>
定義函數
uid_t getuid(void);
函數說明
getuid()用來取得執行目前進程的用戶識別碼。
返回值
用戶識別碼
范例
main()

printf(“uid is %d\n”,getuid());
}
執行
uid is 0 /*當使用root身份執行范例程序時*/
 

 

getutent(從utmp 文件中取得賬號登錄數據)
相關函數
getutent,getutid,getutline,setutent,endutent,pututline,utmpname
表頭文件
#include<utmp.h>
定義函數
struct utmp *getutent(void);
函數說明
getutent()用來從utmp 文件(/var/run/utmp)中讀取一項登錄數據,該數據以utmp 結構返回。第一次調用時會取得第一位用戶數據,之后每調用一次就會返回下一項數據,直到已無任何數據時返回NULL。
utmp結構定義如下
struct utmp
{
short int ut_type; /*登錄類型*/
pid_t ut_pid; /*login進程的pid*/
char ut_line[UT_LINESIZE];/*登錄裝置名,省略了“/dev/”*/
char ut_id[4]; /* Inittab ID*/
char ut_user[UT_NAMESIZE];/*登錄賬號*/
char ut_host[UT_HOSTSIZE];/*登錄賬號的遠程主機名稱*/
struxt exit_status ut_exit;/* 當類型為DEAD_PROCESS時進程的結
束狀態*/
long int ut_session; /*Sessioc ID*/
struct timeval ut_tv; /*時間記錄*/
int32_t ut_addr_v6[4]; /*遠程主機的網絡地址*/
char __unused[20]; /* 保留未使用*/
};
ut_type有以下幾種類型:
EMPTY 此為空的記錄。
RUN_LVL 記錄系統run-level的改變
BOOT_TIME 記錄系統開機時間
NEW_TIME 記錄系統時間改變后的時間
OLD_TINE 記錄當改變系統時間時的時間。
INIT_PROCESS 記錄一個由init衍生出來的進程。
LOGIN_PROCESS 記錄login進程。
USER_PROCESS 記錄一般進程。
DEAD_PROCESS 記錄一結束的進程。
ACCOUNTING 目前尚未使用。
exit_status結構定義
struct exit_status
{
short int e_termination; /*進程結束狀態*/
short int e_exit; /*進程退出狀態*/
};
timeval的結構定義請參考gettimeofday()。
相關常數定義如下:
UT_LINESIZE 32
UT_NAMESIZE 32
UT_HOSTSIZE 256
返回值
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。
附加說明
getutent()在第一次調用時會打開utmp 文件,讀取數據完畢后可使用endutent()來關閉該utmp文件。
范例
#include<utmp.h>
main()
{
struct utmp *u;
while((u=getutent())){
if(u->ut_type = = USER_PROCESS)
printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);
}
endutent();
}
執行
/* 表示有三個root賬號分別登錄/dev/pts/0,/dev/pts/1,/dev/pts/2 */
7 root pts/0
7 root pts/1
7 root pts/2
 

 

getutid(從utmp 文件中查找特定的記錄)
相關函數
getutent,getutline
表頭文件
#include<utmp.h>
定義函數
strcut utmp *getutid(strcut utmp *ut);
函數說明
getutid()用來從目前utmp 文件的讀寫位置逐一往后搜索參數ut指定的記錄,如果ut->ut_type 為RUN_LVL,BOOT_TIME,NEW_TIME,OLD_TIME 其中之一則查找與ut->ut_type 相符的記錄;若ut->ut_type 為INIT_PROCESS,LOGIN_PROCESS,USER_PROCESS或DEAD_PROCESS其中之一,則查找與ut->ut_id相符的記錄。找到相符的記錄便將該數據以utmp 結構返回。utmp結構請參考getutent()。
返回值
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。
范例
#include<utmp.h>
main()
{
struct utmp ut,*u;
ut.ut_type=RUN_LVL;
while((u= getutid(&ut))){
printf(“%d %s %s %s\n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);
}
}
執行
1 runlevel -
 

 

getutline(從utmp 文件中查找特定的記錄)
相關函數
getutent,getutid,pututline
表頭文件
#include<utmp.h>
定義函數
struct utmp * getutline (struct utmp *ut);
函數說明
getutline()用來從目前utmp文件的讀寫位置逐一往后搜索ut_type為USER_PROCESS 或LOGIN_PROCESS 的記錄,而且ut_line 和ut->ut_line 相符。找到相符的記錄便將該數據以utmp 結構返回,utmp結構請參考getutent()。
返回值
返回utmp 結構數據,如果返回NULL 則表示已無數據,或有錯誤發生。
范例
#include<utmp.h>
main()
{
struct utmp ut,*u;
strcpy (ut.ut_line,”pts/1”);
while ((u=getutline(&ut))){
printf(“%d %s %s %s \n”,u->ut_type,u->ut_user,u->ut_line,u->ut_host);
}
}
執行
7 root pts/1
 

 

initgroups(初始化組清單)
相關函數
setgrent,endgrent
表頭文件
#include<grp.h>
#include<sys/types.h>
定義函數
int initgroups(const char *user,gid_t group);
函數說明
initgroups()用來從組文件(/etc/group)中讀取一項組數據,若該組數據的成員中有參數user時,便將參數group組識別碼加入到此數據中。
返回值
執行成功則返回0,失敗則返回-1,錯誤碼存於errno。
 

 

pututline(將utmp 記錄寫入文件)
相關函數
getutent,getutid,getutline
表頭文件
#include<utmp.h>
定義函數
void pututline(struct utmp *ut);
函數說明
pututline()用來將參數ut的utmp結構記錄到utmp文件中。此函數會先用getutid()來取得正確的寫入位置,如果沒有找到相符的記錄則會加入到utmp文件尾,utmp結構請參考getutent()。
返回值
 
附加說明
需要有寫入/var/run/utmp 的權限
范例
#include<utmp.h>
main()
{
struct utmp ut;
ut.ut_type =USER_PROCESS;
ut.ut_pid=getpid();
strcpy(ut.ut_user,”kids”);
strcpy(ut.ut_line,”pts/1”);
strcpy(ut.ut_host,”www.gnu.org”);
pututline(&ut);
}
執行
/*執行范例后用指令who -l 觀察*/
root pts/0 dec9 19:20
kids pts/1 dec12 10:31(www.gnu.org)
root pts/2 dec12 13:33
 

 

seteuid(設置有效的用戶識別碼)
相關函數
setuid,setreuid,setfsuid
表頭文件
#include<unistd.h>
定義函數
int seteuid(uid_t euid);
函數說明
seteuid()用來重新設置執行目前進程的有效用戶識別碼。在Linux下,seteuid(euid)相當於setreuid(-1,euid)。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno
附加說明
請參考setuid
 

 

setfsgid(設置文件系統的組識別碼)
相關函數
setuid,setreuid,seteuid,setfsuid
表頭文件
#include<unistd.h>
定義函數
int setfsgid(uid_t fsgid);
函數說明
setfsgid()用來重新設置目前進程的文件系統的組識別碼。一般情況下,文件系統的組識別碼(fsgid)與有效的組識別碼(egid)是相同的。如果是超級用戶調用此函數,參數fsgid 可以為任何值,否則參數fsgid必須為real/effective/saved的組識別碼之一。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。
附加說明
此函數為Linux特有。
錯誤代碼
EPERM 權限不夠,無法完成設置。
 

 

setfsuid(設置文件系統的用戶識別碼)
相關函數
setuid,setreuid,seteuid,setfsgid
表頭文件
#include<unistd.h>
定義函數
int setfsuid(uid_t fsuid);
函數說明
setfsuid()用來重新設置目前進程的文件系統的用戶識別碼。一般情況下,文件系統的用戶識別碼(fsuid)與有效的用戶識別碼(euid)是相同的。如果是超級用戶調用此函數,參數fsuid可以為任何值,否則參數fsuid必須為real/effective/saved的用戶識別碼之一。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno
附加說明
此函數為Linux特有
錯誤代碼
EPERM 權限不夠,無法完成設置。
 

 

setgid(設置真實的組識別碼)
相關函數
getgid,setregid,getegid,setegid
表頭文件
#include<unistd.h>
定義函數
int setgid(gid_t gid);
函數說明
setgid()用來將目前進程的真實組識別碼(real gid)設成參數gid值。如果是以超級用戶身份執行此調用,則real、effective與savedgid都會設成參數gid。
返回值
設置成功則返回0,失敗則返回-1,錯誤代碼存於errno中。
錯誤代碼
EPERM 並非以超級用戶身份調用,而且參數gid 並非進程的effective gid或saved gid值之一。
 

 

setgrent(從頭讀取組文件中的組數據)
相關函數
getgrent,endgrent
表頭文件
#include<grp.h>
#include<sys/types.h>
定義函數
void setgrent(void);
函數說明
setgrent()用來將getgrent()的讀寫地址指回組文件開頭。
返回值
 
附加說明
請參考setpwent()。
 

 

setgroups(設置組代碼)
相關函數
initgroups,getgroup,getgid,setgid
表頭文件
#include<grp.h>
定義函數
int setgroups(size_t size,const gid_t * list);
函數說明
setgroups()用來將list 數組中所標明的組加入到目前進程的組設置中。參數size為list()的gid_t數目,最大值為NGROUP(32)。
返回值
設置成功則返回0,如有錯誤則返回-1。
錯誤代碼
EFAULT 參數list數組地址不合法。
EPERM 權限不足,必須是root權限
EINVAL 參數size值大於NGROUP(32)。
 

 

setpwent(從頭讀取密碼文件中的賬號數據)
相關函數
getpwent,endpwent
表頭文件
#include<pwd.h>
#include<sys/types.h>
定義函數
void setpwent(void);
函數說明
setpwent()用來將getpwent()的讀寫地址指回密碼文件開頭。
返回值
 
范例
#include<pwd.h>
#include<sys/types.h>
main()
{
struct passwd *user;
int i;
for(i=0;i<4;i++){
user=getpwent();
printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,
user->pw_gecos,user->pw_dir,user->pw_shell);
}
setpwent();
user=getpwent();
printf(“%s :%d :%d :%s:%s:%s\n”,user->pw_name,user->pw_uid,user->pw_gid,
user->pw_gecos,user->pw_dir,user->pw_shell);
endpwent();
}
執行
root:0:0:root:/root:/bin/bash
bin:1:1:bin:/bin
daemon:2:2:daemon:/sbin
adm:3:4:adm:/var/adm
root:0:0:root:/root:/bin/bash
 

 

setregid(設置真實及有效的組識別碼)
相關函數
setgid,setegid,setfsgid
表頭文件
#include<unistd.h>
定義函數
int setregid(gid_t rgid,gid_t egid);
函數說明
setregid()用來將參數rgid設為目前進程的真實組識別碼,將參數egid設置為目前進程的有效組識別碼。如果參數rgid或egid值為-1,則對應的識別碼不會改變。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。
 

 

setreuid(設置真實及有效的用戶識別碼)
相關函數
setuid,seteuid,setfsuid
表頭文件
#include<unistd.h>
定義函數
int setreuid(uid_t ruid,uid_t euid);
函數說明
setreuid()用來將參數ruid 設為目前進程的真實用戶識別碼,將參數euid 設置為目前進程的有效用戶識別碼。如果參數ruid 或euid值為-1,則對應的識別碼不會改變。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。
附加說明
請參考setuid()。
 

 

setuid(設置真實的用戶識別碼)
相關函數
getuid,setreuid,seteuid,setfsuid
表頭文件
#include<unistd.h>
定義函數
int setuid(uid_t uid)
函數說明
setuid()用來重新設置執行目前進程的用戶識別碼。不過,要讓此函數有作用,其有效的用戶識別碼必須為0(root)。在Linux下,當root使用setuid()來變換成其他用戶識別碼時,root權限會被拋棄,完全轉換成該用戶身份,也就是說,該進程往后將不再具有可setuid()的權利,如果只是向暫時拋棄root 權限,稍后想重新取回權限,則必須使用seteuid()。
返回值
執行成功則返回0,失敗則返回-1,錯誤代碼存於errno。
附加說明
一般在編寫具setuid root的程序時,為減少此類程序帶來的系統安全風險,在使用完root權限后建議馬上執行setuid(getuid());來拋棄root權限。此外,進程uid和euid不一致時Linux系統將不會產生core dump。
 

 

setutent(從頭讀取utmp 文件中的登錄數據)
相關函數
getutent,endutent
表頭文件
#include<utmp.h>
定義函數
void setutent(void);
函數說明
setutent()用來將getutent()的讀寫地址指回utmp文件開頭。
附加說明
請參考setpwent()或setgrent()。
 

 

utmpname(設置utmp 文件路徑)
相關函數
getutent,getutid,getutline,setutent,endutent,pututline
表頭文件
#include<utmp.h>
定義函數
void utmpname(const char * file);
函數說明
utmpname()用來設置utmp文件的路徑,以提供utmp相關函數的存取路徑。如果沒有使用utmpname()則默認utmp文件路徑為/var/run/utmp。
返回值
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM