1、用户口令:/etc/passwd文件
该文件中包含下列结构体信息。其中,当下主修熊passwd不再这里显示,是使用了一个占位符。
struct passwd { char * pw_name; /* 用户名e, POSIX.1 */ char * pw_passwd; /* 密码*/ uid_t pw_uid; /* 数值化用户ID, POSIX.1 */ gid_t pw_gid; /* 数值化组ID, POSIX.1 */ char * pw_gecos; /* 注释 */ char * pw_dir; /* 用户根目录, POSIX.1 */ char * pw_shell; /* 默认shell, POSIX.1 */ char *pw_class; /* 用户访问类 */ time_t pw_change; /* 下次更改密码时间 */ time_t pw_expire; /* 账户到期时间 */ };
涉及到函数
#include <pwd.h> struct passwd *getpwuid(uid_tuid); struct passwd *getpwnam(const char *name); Both return: pointer if OK,NULLon erro
getpwuid函数由ls(1)程序使用,它将i节点中的数值用户id映射为用户登录名。在键入登录名时,getpwnam函数由login(1)程序使用。
#include <pwd.h> struct passwd *getpwent(void); Returns: pointer if OK,NULLon error or end of file void setpwent(void); void endpwent(void);
这三个函数用在getpwnam中,用法如下:
#include <pwd.h> #include <stddef.h> #include <string.h> struct passwd * getpwnam(const char *name) { struct passwd *ptr; setpwent(); while ((ptr = getpwent()) != NULL) if (strcmp(name, ptr->pw_name) == 0) break; /* found a match */ endpwent(); return(ptr); /* ptr is NULL if no match found */ }
2、阴影口令/etc/shadow
仅有login和password等少数几个程序需要用到加密口令的存取。
阴影口令使用结构体:(该结构体中只有用户名和加密口令是必须的,其他的只是用户控制账户时间信息)
struct passwd { 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; //保留 }
访问阴影口令文件的相关函数:
#include <shadow.h> struct spwd *getspnam(const char *name); struct spwd *getspent(void); Both return: pointer if OK,NULLon error void setspent(void); void endspent(void);
3、组文件/etc/group
结构体
struct group { char *gr_name; char *gr_passwd; int gr_gid; char **gr_mem; }
</pre></div><div><div>相关函数:</div></div><div><pre name="code" class="cpp">#include <grp.h> struct group *getgrent(void); Returns: pointer if OK,NULLon error or end of file void setgrent(void); void endgrent(void);
4、附加组
实现了一个用户参加多个组
#include <unistd.h> int getgroups(intgidsetsize,gid_tgrouplist[]); Returns: number of supplementary group IDs if OK,−1 on error #include <grp.h> /* on Linux */ #include <unistd.h> /* on FreeBSD, Mac OS X, and Solaris */ int setgroups(intngroups,const gid_tgrouplist[]); #include <grp.h> /* on Linux and Solaris */ #include <unistd.h> /* on FreeBSD and Mac OS X */ int initgroups(const char *username,gid_tbasegid); Both return: 0 if OK,−1 on error