APUE学习笔记——6 系统数据文件与信息

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


原文地址:https://www.cnblogs.com/Windeal/p/4284655.html