|
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
|