Unix系统中的口令文件:/etc/passwd
里面各字段定义在<pwd.h>中的passwd 结构中。其中共有10个字段,大多数平台至少支持其中的7个(Linux中一般包含前七个字段)。
下面说下 struct passwd结构成员:
1 struct passwd{
2 char *pw_name; /*用户名*/
3 char *pw_passwd; /*加密口令*/
4 uid_t pw_uid; /* 用户ID*/
5 gid_t pw_gid; /* 组ID*/
6 char *pw_gecos; /* 注释字段*/
7 char *pw_dir; /*初始shell*/
8 char *pw_class; /*用户访问类*/
9 time_t pw_change; /* 下次更改口令时间*/
10 time_t pw_expire; /*账户到期时间 */
11 };
下面介绍几个可以用来查询这个口令文件的函数:
1 #include<pwd.h>
2
3 /* 这两个函数,只需给出用户登录名和用户ID,就可查询相关项了
4
5 Return Value: 若成功,返回指向passwd 结构的指针,出错返回NULL
6
7 */
8
9 struct passwd *getpwuid(uid_t uid);
10
11 struct passwd *getpwnam(const char *name);
12
13 /*下面三个函数可以用来查看完全的passwd文件 */
14
15 struct passwd *getpwent(void); /*成功,返回指向passwd 结构的指针,失败:NULL*/
16
17 void setpwent(void);
18
19 void endpwent(void);
对这三个函数的几点说明:
(1)调用getpwent时,它返回passwd中的下一个记录项,即一个指向填写好的passwd 结构的指针,每次调用此函数都会重写此结构.(注:在调用此函数后,一定要用endpwent关闭之)
(2)setpwent 就类似于rewind,就是将文件偏移量指向开头
(3)endpwend 关闭这些文件
ex:下面是对getpwnam函数的实现
1 #include<pwd.h>
2
3 #include<stdddef.h>
4
5 #include<string.h>
6
7 struct passwd *
9 getpwnam(const char *name)
10
11 {
12 struct passwd *ptr;
13 setpwent();
14 while((ptr = getpwent()) != NULL)
15 if(strcmp(name, prt->pw_name) == 0)
16 break;
17 endpwent();
18 return prt;
19 }
下面说下/etc/shadow文件,先上结构体:
1 struct spwd{
2 char *sp_namp; /*用户登录名*/
3 char *sp_pwdp; /*加密口令*/
4 int sp_lstchg; /* 上次更改口令以来经历过的时间*/
5 int sp_min; /* 经过多少天后允许更改*/
6 int sp_max; /* 要求更改尚余天数*/
7 int sp_warn; /*到期警告天数*/
8 int sp_inact; /*账户不活动之前尚余天数*/
9 int sp_expire; /*账户到期天数*/
10 unsigned int sp_flag; /*保留*/
11 };
对shadow文件访问的函数:
1 #include <shadow.h>
2 /*下面两个函数,若成功,刚返回指针,失败返回NULL*/
3 struct spwd *getspnam(const char *name);
4 strcut spwd *getspent(void);
5
6 /*类似于passwd 文件的访问操作*/
7 void setspent(void);
8 void endspent(void);
注:在FreeBSD 5.2.1和MAC OS X 10.3中,没有shadow结构体,附加的账户信息存放在passwd文件中。
浙公网安备 33010602011771号