美文网首页我用 LinuxLinux学习|Gentoo/Arch/FreeBSD
[Linux实用命令]-3-用户和组管理

[Linux实用命令]-3-用户和组管理

作者: 晴刃 | 来源:发表于2021-04-17 16:14 被阅读0次

    引言

    这篇文章主要介绍Linux中用户和用户组的基础知识;包括如何使用命令创建和删除用户、创建和删除用户组,以及如何有效的管理用户和用户组。

    文章目录

    • 0×1.Linux用户信息文件和密码文件
    • 0×2.Linux用户组信息文件和组密码文件
    • 0×3.Linux用户组管理
    •      a.如何创建组
      
    •      b.如何重命名组
      
    •      c.如何删除组
      
    • 0×4.Linux用户管理
    •      a.如何添加用户
      
    •      b.如何重命名用户
      
    •      c.如何锁定和解锁用户
      
    •      d.如何删除用户
      
    •      e.修改用户属组
      

    0×1.Linux用户信息文件和密码文件

    当创建一个用户时,用户的账户信息被保存在用户信息文件中,只有root权限才能修改这个文件的内容,非root用户只能读取其中的内容:

    #用户账户信息文件在Linux系统"/etc/passwd"文件中,使用vim查看其内容
    qing@qingsword.com:~$ vim /etc/passwd
     
    #这一条是root账户的信息
    root:x:0:0:root:/root:/bin/bash
     
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    #...省略部分输出
     
    #这一条是当前使用的账户信息
    qingsword:x:500:500::/home/qingsword:/bin/bash
     
    #账户信息使用":"分隔,各字段内容解释如下:
    #username:password:uid:gid:userinfo:home:shell
    #拿"qingsword:x:500:500::/home/qingsword:/bin/bash"举例:
    #用户名qingsword;密码并非保存在这个文件中所以用"x"代替;uid是用户ID值,root用户的UID=0,系统用户的UID范围是1-499,其他用户的UID为499-4.29E9+(42亿多个);gid是用户的组ID,ID值的分配同UID,qingsword的UID和GID都是500;userinfo是用户信息,一般等于用户名,qingsword的这一项为空;home是用户的家目录,qingsword的家目录是"/home/qingsword";shell是用户加载后执行的shell,一般为/bin/bash
    

    如果有root权限,在这个文件中,将某个用户的UID和GID全部改成0,比如"qingsword:x:0:0::/home/qingsword:/bin/bash",这样"qingsword"就有了root权限。

    在Linux中,用户的账户信息和密码信息是分开保存的,在查看用户账户信息文件的时候,发现密码部分使用"x"隐藏了,实际上,用户的密码是被加密后保存在"/etc/shadow"这个文件中的,这个文件的权限更加严格,只有root权限才能查看和修改它,非root用户是看不到内容的(或者在普通用户权限下使用sudo命令前缀):

    #查看密码文件的内容
    [root@localhost~]$ sudo vim /etc/shadow
    root:6e5sGDXdfashsdf32:15453:0:99999:7:::
    ....
    qingsword:md03zQ9RmYDhV:15700:0:99999:7:::
     
    #上面省略了部分输出,仅保留了root与,当前账户qingsword的输出,对应的各字段解释如下:
    #username:password:lastChg:min:max:warm:inactive:expire:flag
    #拿"root:6e5sGDXdfashsdf32:15453:0:99999:7:::"举例:
    #username是root
    #password是"6e5sGDXdfashsdf32",这是加密后的密码
    #lastChg:从1970年1月1日起到上次修改密码所经历的天数
    #min:两次修改密码最小间隔,0为无间隔
    #max:密码有效天数,99999为永不过期
    #warm:口令失效前多少天,系统向用户发出警告(默认7天)
    #inactive:禁止登陆前,用户名还有效的天数
    #expire:用户禁止登陆的时间
    #flag:保留域
    #最后这三个参数在root中并没有使用
    

    在Ubuntu桌面版中,假如你忘记了开机密码,可以使用一张Linux启动盘(U盘)启动,然后挂载上你忘记密码的那个系统的分区(假设挂载到U盘系统的/mnt目录下),然后通过vi删除"/mnt/etc/shadow"文件中对应账户的密码字段(或者删除"/mnt/etc/passwd"中对应账户名后面密码字段的那个"x"),都可以达到清空开机密码的目的。

    0×2.Linux用户组信息文件和组密码文件

    用户的组信息保存在文件"/etc/group"中,只有root权限才能对此文件作出修改,其他用户只能查看;组密码文件保存在"/etc/gshadow"中,只有root权限才能查看和修改,其他用户无权查看:

    #查看组信息文件中的内容
    qing@qingsword.com:~$ vim /etc/group
     
    #root组
    root:x:0:
    bin:x:1:bin,daemon
    daemon:x:2:bin,daemon
    sys:x:3:bin,adm
    #...省略部分输出
     
    #这是当前用户所在组,当用户被创建时,如果没有指定所属组,将自动创建一个与用户名称相同的组,并将用户划分到这个组下
    qingsword:x:500:
     
    #用户组信息格式如下:
    #username:password:GID:g_members
    #在“qingsword:x:500:”中
    #username是qingsword
    #password使用x隐藏,组密码单独保存在/etc/gshadow文件中
    #GID是500,root的gid是0,系统gid从1-499(Ubuntu系统是1~1000),用户可以使用的gid从500开始,和UID范围是相同的,
    #g_members:代表在这个组里面的成员列表,用逗号分隔
    

    0×3.Linux用户组管理

    下面的操作需要root权限或使用sudo命令前缀才能执行。

    a.如何创建组

    创建一个随机GID的用户组:

    #创建一个随机GID的用户组(GID一般是递增的),组名是testgroup1
    qing@qingsword.com:~$ sudo groupadd testgroup1
     
    #查看
    qing@qingsword.com:~$ sudo more /etc/group
    root:x:0:
    ......
    qingsword:x:500:
    testgroup1:x:501: #这是刚才创建的用户组,GID是501
    

    创建一个指定GID的用户组:

    #指定GID是1555,组名是testgroup2
    qing@qingsword.com:~$ sudo groupadd -g 1555 testgroup2
     
    qing@qingsword.com:~$ sudo more /etc/group
    root:x:0:
    ......
    qingsword:x:500:
    testgroup1:x:501:
    testgroup2:x:1555:
    

    创建一个系统组:

    #创建系统组,可以使用-g指定GID不指定则系统自动分配
    qing@qingsword.com:~$ sudo groupadd -r testsystemgroup1
     
    qing@qingsword.com:~$ sudo more /etc/group
    root:x:0:
    ......
    qingsword:x:500:
    testgroup1:x:501:
    testgroup2:x:1555:
    testsystemgroup1:x:495:  #GID范围在1-499的都是系统组(Ubuntu用户是1-1000)
     
    #指定GID,但是不要和现有GID冲突
    qing@qingsword.com:~$ sudo groupadd -g 496 -r testsystemgroup2
    groupadd: GID '496' already exists  #如果出现这个提示就代表这个系统组ID已经被使用了
    

    b.如何重命名组

    可以通过groupmod来更改当前已存在的组名,同时也能更改GID,请看下面的实例:

    #将"testgroup1"改名成"testgroup111"
    qing@qingsword.com:~$ sudo groupmod -n testgroup111 testgroup1
     
    #将"testgroup2"改名成"testgroup222"并将GID更改成666
    qing@qingsword.com:~$ sudo groupmod -g 666 -n testgroup222 testgroup2
    

    c.如何删除组

    可以使用下面的命令来删除当前已存在的组:

    #删除上面创建的"testsystemgroup1"
    qing@qingsword.com:~$ sudo groupdel testsystemgroup1
    通过上面的操作,现在系统中有两个新创建的用户组,分别是"testgroup111"和"testgroup222",继续下面的实验。
    

    0×4.Linux用户管理

    a.如何添加用户

    使用useradd命令来创建用户:

    #不带任何参数,添加一个名称为"testuser1"的用户,系统会自动创建一个用户组,组名和用户名相同,然后将将这个用户划分到这个用户组下
    qing@qingsword.com:~$ sudo useradd testuser1
     
    #设置用户密码
    qing@qingsword.com:~$ sudo passwd testuser1
     
    #创建一个新用户"testuser222",指定他的UID为2222,并且将他分配到"testgroup222"这个组中
    qing@qingsword.com:~$ sudo useradd -u 2222 -g testgroup222 testuser222
     
    #创建一个新用户"testuser111",指定他的UID为1111,将他分配到"testgroup111"这个组中,并指定他的家目录为"/home/user111"
    qing@qingsword.com:~$ sudo useradd -u 1111 -g testgroup111 -d /home/user111 testuser111
    

    b.如何重命名用户

    使用usermod命令重命名用户:

    #将"testuser222"重命名为"qingsword123"
    qing@qingsword.com:~$ sudo usermod -l qingsword123 testuser222
     
    #将上面创建的"testuser1",重命名为"hello",并且将家目录也重命名为hello
    qing@qingsword.com:~$ sudo usermod -m -d /home/hello -l hello testuser1
    

    这个命令还能添加参数-g更改户组、-u更改UID等,大家可以自己去尝试一下。

    c.如何锁定和解锁用户

    #锁定hello用户,可以使用"Ctrl+Alt+F2"切换到tty2下面,然后尝试用被锁定的这个账户登录,会发现提示"Login incorrect",登录不上
    qing@qingsword.com:~$ sudo usermod -L hello
     
    #使用下面的命令解锁之后,就能正常登录了
    qing@qingsword.com:~$ sudo usermod -U hello
    

    d.如何删除用户

    可以使用"userdel"命令来彻底删除用户:

    #参数-r,可以删除用户并且删除用户的家目录以及邮件文件,用户邮件保存在目录"/var/spool/mail/"中
    qing@qingsword.com:~$ sudo userdel -r hello
    Ps:在Ubuntu系统中,普通用户的UID和GID都是从1000开始的,1000以内都是系统UID和GID,而CentOS系统的普通用户UID和GID是从500开始的,请根据不同系统自行判断。
    

    e.修改用户属组

    在CentOS使用useradd创建用户后,默认会创建一个与用户同名的用户组,这个组就是用户的默认属组,不仅如此,用户也同时能够属于多个组,请看下面的实例:

    #创建两个用户u1,u2
    qing@qingsword.com:~$ sudo useradd u1
    qing@qingsword.com:~$ sudo useradd u2
     
    #查看新建用户
    qing@qingsword.com:~$ tail -n 2 /etc/passwd
    u1:x:1001:1001::/home/u1:/bin/bash
    u2:x:1002:1002::/home/u2:/bin/bash
     
    #新建用户默认属组,从下面输出可以看到,系统自动创建了两个与用户同名的组
    qing@qingsword.com:~$ tail -n 2 /etc/group
    u1:x:1001:
    u2:x:1002:
     
    #现在再来创建两个组
    qing@qingsword.com:~$ sudo groupadd g1
    qing@qingsword.com:~$ sudo groupadd g2
     
    qing@qingsword.com:~$ tail -n 2 /etc/group
    g1:x:1003:
    g2:x:1004:
     
    #使用"usermod -g 组名 用户名"更改u1的默认属组为g1
    qing@qingsword.com:~$ sudo usermod -g g1 u1
     
    #查看u1的组ID为1003也就是g1的组ID
    qing@qingsword.com:~$ tail -n 2 /etc/passwd
    u1:x:1001:1003::/home/u1:/bin/bash
    u2:x:1002:1002::/home/u2:/bin/bash
     
    #将u2添加到g1与g2组,语法
    #usermod -G 组名,组名 用户名
    qing@qingsword.com:~$ sudo usermod -G g1,g2 u2
     
    #查看u2的组ID仍然为1002,说明它的默认组仍然是u2
    qing@qingsword.com:~$ tail -n 2 /etc/passwd
    u1:x:1001:1003::/home/u1:/bin/bash
    u2:x:1002:1002::/home/u2:/bin/bash
     
    #如果用户默认组是g1,就不会显示在冒号后面,所以下面的输出中,u2显示在冒号后面,因为它的默认组是u2,不是g1和g2,但它属于g1和g2组中的一员
    qing@qingsword.com:~$ tail -n 2 /etc/group
    g1:x:1003:u2
    g2:x:1004:u2
     
    #将用户u1的默认组改回u1组,然后将u1放到g1组中
    qing@qingsword.com:~$ sudo usermod -g u1 u1
    qing@qingsword.com:~$ sudo usermod -G g1 u1
     
    #这次可以看到g1后面出现了u1这个用户
    qing@qingsword.com:~$ tail -n 2 /etc/group
    g1:x:1003:u2,u1
    g2:x:1004:u2
    

    再来看另一个实例:

    #首先创建一个组g1,一个用户u1
    root@qingsword.com:~# groupadd g1
    root@qingsword.com:~# useradd u1
    root@qingsword.com:~# passwd u1
    输入新的 UNIX 密码:
    重新输入新的 UNIX 密码:
    passwd:已成功更新密码
     
    #查看u1的ID,它默认属于u1组
    root@qingsword.com:~# id u1
    uid=1014(u1) gid=1016(u1) 组=1016(u1)
     
    #将u1放到g1组里面
    root@qingsword.com:~# usermod -G g1 u1
    root@qingsword.com:~# id u1
    uid=1014(u1) gid=1016(u1) 组=1016(u1),1015(g1)
     
    #使用root权限创建一个测试文件
    root@qingsword.com:~# touch rootfile
     
    #将这个测试文件的属组改成g1
    root@qingsword.com:~# chgrp g1 rootfile
    root@qingsword.com:~# ls -al rootfile
    -rw-r--r-- 1 root g1 0 12月  6 11:40 rootfile
     
    #对rootfile写入数据
    root@qingsword.com:~# echo www.qingsword.com > rootfile
     
    #将rootfile复制到/home目录
    root@qingsword.com:~# cp rootfile /home
    #切换到u1用户,尝试读取文件内容
    root@qingsword.com:~# su u1
    u1@qingsword.com:/root$ cd /home
    u1@qingsword.com:/home$ more rootfile
    www.qingsword.com
     
    #虽然文件所有者是root但是因为u1属于g1组,并且文件属组对文件有可读权限,所以上面能够使用u1来读取文件内容
    u1@qingsword.com:/home$ ls -al rootfile
    -rw-r--r-- 1 root share 18 12月  6 11:41 rootfile
     
    #但是不可写
    u1@qingsword.com:/home$ echo qingsword.com >> rootfile
    bash: rootfile: 权限不够
    

    从上面这个实例可以看到,对文件而言,如果文件所有者不是u1,只要文件的属组是g1,u1又属于g1组,不管用户的默认组是不是g1,用户对这个文件的权限就等于g1组对这个文件的权限。

    相关文章

      网友评论

        本文标题:[Linux实用命令]-3-用户和组管理

        本文链接:https://www.haomeiwen.com/subject/cqzulltx.html