您的位置:首页 > 其它

/etc/passwd & /etc/shadow文件学习

2011-09-26 13:04 363 查看
Unix系统中的口令文件:/etc/passwd里面各字段定义在<pwd.h>中的passwd 结构中。其中共有10个字段,大多数平台至少支持其中的7个(Linux中一般包含前七个字段)。下面说下 struct passwd结构成员:
struct passwd{
char *pw_name;  /*用户名*/
char *pw_passwd;   /*加密口令*/
uid_t pw_uid;  /* 用户ID*/
gid_t pw_gid;  /* 组ID*/
char *pw_gecos;  /* 注释字段*/
char *pw_dir;  /*初始shell*/
char *pw_class;  /*用户访问类*/
time_t pw_change;   /* 下次更改口令时间*/
time_t pw_expire;    /*账户到期时间 */
};
下面介绍几个可以用来查询这个口令文件的函数:
#include<pwd.h>

/*  这两个函数,只需给出用户登录名和用户ID,就可查询相关项了

Return Value: 若成功,返回指向passwd 结构的指针,出错返回NULL

*/

struct passwd *getpwuid(uid_t uid);

struct passwd *getpwnam(const char *name);

/*下面三个函数可以用来查看完全的passwd文件 */

struct passwd *getpwent(void);  /*成功,返回指向passwd 结构的指针,失败:NULL*/

void setpwent(void);

void endpwent(void);
对这三个函数的几点说明:(1)调用getpwent时,它返回passwd中的下一个记录项,即一个指向填写好的passwd 结构的指针,每次调用此函数都会重写此结构.(注:在调用此函数后,一定要用endpwent关闭之)(2)setpwent 就类似于rewind,就是将文件偏移量指向开头(3)endpwend 关闭这些文件ex:下面是对getpwnam函数的实现
 #include<pwd.h>#include<stdddef.h>#include<string.h>struct passwd *
getpwnam(const char *name){
  struct passwd *ptr;
  setpwent();
  while((ptr = getpwent()) != NULL)
    if(strcmp(name, prt->pw_name) == 0)
      break;
  endpwent();
  return prt;
}
下面说下/etc/shadow文件,先上结构体:
struct spwd{
char *sp_namp; /*用户登录名*/
char *sp_pwdp; /*加密口令*/
int sp_lstchg; /* 上次更改口令以来经历过的时间*/
int sp_min;     /* 经过多少天后允许更改*/
int sp_max;   /* 要求更改尚余天数*/
int sp_warn;  /*到期警告天数*/
int sp_inact;  /*账户不活动之前尚余天数*/
int sp_expire; /*账户到期天数*/
unsigned int sp_flag; /*保留*/
};
对shadow文件访问的函数:
 #include <shadow.h>
/*下面两个函数,若成功,刚返回指针,失败返回NULL*/
struct spwd *getspnam(const char *name);
strcut spwd *getspent(void);/*类似于passwd 文件的访问操作*/
void setspent(void);
void endspent(void);
注:在FreeBSD 5.2.1和MAC OS X 10.3中,没有shadow结构体,附加的账户信息存放在passwd文件中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: