• Linux-文件元数据操作


    Linux用户和组管理文件之一-/etc/passwd等文件



    1、如何将用户对应的ID转换为相应的用户字符串

    在使用stat(2)获取文件的元数据之后,可以用geipwuid(3)通过stat获取的uid来得到用户信息

    getpwuid(3)

    #include<sys/types.h>

    #include<pwd.h>

    struct passwd *getpwuid(uid_t uid);


    功能:

      获取用户信息

     参数:
      指定用户的uid

      
    返回值:

      成功:返回一个指向struct passwd的结构体的指针

      失败:(可能是找不到用户信息或者其它错误)NULL,同时errno被设置/

    2、通过gid获取组信息

      getgrnam(3):通过组名字符串获取

      getgrgid(3):通过gid获取组信息

    #Include<sys/types.h>

    #include<grp.h>

    struct group *getgrgid(gid_t gid);

    功能:用过gid获取组信息

    参数:

      指定组的ID

      group结构体如下:

     struct group{

            char *gr_name;    /*group name*/

            char *gr_passwd   /*group password*/

            gid_t gr_gid      /*group ID*/

            char **gr_mem    /group members*/

    };

    返回值:

      成功:返回一个指向struct group的结构体的指针

      失败:(可能是找不到用户组信息或者其它错误)NULL,同时errno被设置/

    示例:

    /* 取得gid=3的组数据*/

    #include<grp.h>

    #include<sys/types.h>

    main()

    {

    strcut group *data;

    int i=0;

    data = getgrgid(3);

    printf(“%s:%s:%d:”,data->gr_name,data->gr_passwd,data-

    >gr_gid);

    while(data->gr_mem[i])printf(“%s ,”,data->mem[i++]);

    printf(“ ”);

    }

    执行 sys:x:3:root,bin,adm

    3、长整型时间转换为字符串格式时间

    ctime(3)

    #include<time.h>

    char *ctime(const time_t *timep);

    功能:

      将长整型的时间转换为字符串格式

    参数:

      timep:长整型时间(stat系统调用函数返回的成员)

    返回值:

      错误:NULL

      成功:时间字符串

     

    4、使用宏检查文件类型

    S_ISLNK(st_mode):是否是一个连接.返回真,即成立
    S_ISREG(st_mode)是否是一个常规文件.
    S_ISDIR(st_mode)是否是一个目录

    S_ISCHR(st_mode)是否是一个字符设 备.
    S_ISBLK(st_mode)是否是一个块设备
    S_ISFIFO(st_mode)是否 是一个FIFO文件.

    S_ISSOCK(st_mode)是否是一个SOCKET文件 

    以上宏在stat(2)所包含的头文件中

    5、文件权限

    打印stat(2)返回变量中的成员文件权限st_mode

    st_mode是用特征位来表示文件类型的,特征位的定义如下,部分宏也可以查询文件类型或有其他作用

    S_IFMT 0170000 文件类型的位遮罩(使用文件类型mask,即S_IFMT&st_mode得到的结果即可判断文件类型)
    S_IFSOCK 0140000 scoket
    S_IFLNK 0120000 符号连接
    S_IFREG 0100000 一般文件
    S_IFBLK 0060000 区块装置
    S_IFDIR 0040000 目录
    S_IFCHR 0020000 字符装置
    S_IFIFO 0010000 先进先出
    S_ISUID 04000 文件的(set user-id on execution)位
    S_ISGID 02000 文件的(set group-id on execution)位
    S_ISVTX 01000 文件的sticky位

    S_IRWXU 00700 文件属主权限掩码
    S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
    S_IRGRP 00040 用户组具可读取权限
    S_IWGRP 00020 用户组具可写入权限
    S_IXGRP 00010 用户组具可执行权限
    S_IROTH 00004 其他用户具可读取权限
    S_IWOTH 00002 其他用户具可写入权限
    S_IXOTH 00001 其他用户具可执行权限


    用户信息文件
    1、/etc/passwd文件

    这个文件中存放的是系统的所有的用户的信息。可以使用cat命令查看次文件的具体内容

        
    1)/etc/passwd 的内容理解:
      在/etc/passwd 中,每一行都表示的是一个用户的信息;一行有7个段位;每个段位用:号分割,例如:


       beinan:x:500:500:beinan sun:/home/beinan:/bin/bash
       linuxsir:x:501:502::/home/linuxsir:/bin/bash


      第一字段:用户名(也被称为登录名);在上面的例子中,我们看到这两个用户的用户名分别是 beinan 和linuxsir;

      第二字段:口令;在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中;

      第三字段:UID ;请参看本文的UID的解说;

      第四字段:GID;请参看本文的GID的解说;

      第五字段:用户名全称,这是可选的,可以不设置,在beinan这个用户中,用户的全称是beinan sun ;而linuxsir 这个用户是没有设置全称;

      第六字段:用户的家目录所在位置;beinan 这个用户是/home/beinan ,而linuxsir 这个用户是/home/linuxsir ;

      第七字段:用户所用SHELL 的类型,beinan和linuxsir 都用的是 bash ;所以设置为/bin/bash ;

    2)关于UID 的理解:
    UID 是用户的ID 值,在系统中每个用户的UID的值是唯一的,更确切的说每个用户都要对应一个唯一的UID,系统管理员应该确保这一规则。系统用户的UID的值从0开始,是一个正整数,至于最大值可以在/etc/login.defs可以查到,一般Linux发行版约定为60000;UID 是确认用户权限的标识,用户登录系统所处的角色是通过UID 来实现的,而非用户名,切记; 在Linux 中,root的UID是0,拥有系统最高权限;比如我在/etc/passwd 中把beinan的UID改为0后,你设想会发生什么呢?beinan这个用户会被确认为root用户。beinan这个帐号可以进行所有root的操作;

      
    一般情况下,每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用,虚拟用户一般是系统安装时就有的,是为了完成系统任务所必须的用户,但虚拟用户是不能登录系统的,比如ftp、nobody、adm、rpm、bin、shutdown等;预留数量以各个系统中/etc/login.defs
    中的 UID_MIN 的最小值为准;比如Fedora 系统 login.defs的UID_MIN是500,而UID_MAX值为60000,也就是说我们通过adduser默认添加的用户的UID的值是500到60000之间;

    查看/etc/login.defs如下
    # Min/max values for automatic gid selection in groupadd
    #
    GID_MIN             1000
    GID_MAX            60000
    # System accounts
    #SYS_GID_MIN          100
    #SYS_GID_MAX          999

    2、关于/etc/shadow
      1)/etc/shadow 概说;
      /etc/shadow文件是/etc/passwd 的影子文件,这个文件并不由/etc/passwd
    而产生的,这两个文件是应该是对应互补的;shadow内容包括用户及被加密的密码以及其它/etc/passwd
    不能包括的信息,比如用户的有效期限等;这个文件只有root权限可以读取和操作,权限如下:
      -r——– 1 root root 1.5K 10月 16 09:49 /etc/shadow

      2)/etc/shadow 的内容分析;
      /etc/shadow 文件的内容包括9个段位,每个段位之间用:号分割;我们以如下的例子说明;


      beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::
      linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:


      第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;
      第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;
      第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;
      第四字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,PASS_MIN_DAYS 中有定义;
      第五字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;
      第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;
      第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;
      第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;
      第九字段:保留字段,目前为空,以备将来Linux发展之用;

    3/etc/group 解说;
    文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用
    户组的用户之间具有相似的特征。

    (1)、/etc/group 内容具体分析
      /etc/group 的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;格式如下:
      group_name:passwd:GID:user_list
      在/etc/group 中的每条记录分四个字段:
      第一字段:用户组名称;
      第二字段:用户组密码;
      第三字段:GID
      第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
      我们举个例子:
      root:x:0:root,linuxsir 注:用户组root,x是密码段,表示没有设置密码,GID是0,root用户组下包括root、linuxsir以及GID为0的其它用户(可以通过/etc/passwd查看);;

    (2)、关于GID ;
      GID和UID类似,是一个正整数或0,GID从0开始,GID为0的组让系统付予给root用户组;系统会预留一些较靠前的GID给系统虚拟
    用户(也被称为伪装用户)之用;查看系统添加用户组默认的GID范围应该查看 /etc/login.defs 中的 GID_MIN 和GID_MAX 值;
      我们可以对照/etc/passwd和/etc/group 两个文件;我们会发现有默认用户组之说;即当一个用属于多个组时会有一个默认的组;在创建目录和文件时,会使用默认的用户组;


     

  • 相关阅读:
    C#转义字符,以及@的作用
    建立数据库链接 create database link以及synonym
    Oracle11g密码区分大小写导致database link无法连接
    ES5:深入解析如何js定义类或对象。
    jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
    浅析JavaScript访问对象属性和方法及区别
    Angular ui-router的常用配置参数详解
    Angular 通过constant(name,value),value(name,value)创建服务
    Angular ocLazyLoad 与ui-router的配合使用
    AngularJs指令配置参数scope详解
  • 原文地址:https://www.cnblogs.com/ptfe/p/10962170.html
Copyright © 2020-2023  润新知