zoukankan      html  css  js  c++  java
  • 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
    


  • 相关阅读:
    变量未定义
    国产银河麒麟Kylin V10操作系统-如何将应用程序固定到任务栏方便启动
    国产银河麒麟Kylin V10操作系统-如何配置Win+E快捷键打开“我的电脑”
    国产银河麒麟Kylin V10操作系统
    微信小程序中的细节
    vue + element初始化项目--代码初始化
    vscode, eslint, prettier, vetur冲突及解决
    VS Code 中 Vetur、prettier、ESLint 使用
    方法合集
    MedicalViewer 事件成员
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284655.html
Copyright © 2011-2022 走看看