Linux 常用C函數(用戶組篇1)

Linux 常用C函數(用戶組篇1)
2007-03-22 11:40
 

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
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章