一、用户身份与用户组记录的文件

  •   ​在Linux系统当中,默认情况下所有的系统上的账号信息都记录在/etc/passwd这个文件内(包括root用户)。而个人密码记录在/etc/shadow这个文件内。所有Linux的组名都记录在/etc/group内。这三个文件非常重要,不要轻易做变动。在后续内容中,我们还会详细做介绍

  • 综上,用户身份与用户组的概念,能够帮助我们的Linux多任务环境变得更为容易管理

  • 实现用户账号的管理,要完成的工作主要有如下几个方面:


    • 用户账号的添加、删除与修改(以及更改用户所属用户组)。
    • 用户口令的管理。
    • 用户组的添加、删除管理。

  • 1.用户管理—添加用户组

  • ·用户账号的管理工作主要包括用户用户账号的添加、修改和删除

  • ·添加用户账号就是在系统中创建一个新的账号,然后新账号分配用户号、用户组、主目录和登陆shell等资源,刚添加的账号是锁定的,无法直接登陆。

  • ·命令:useradd 【选项】用户名

  • 参数说明:

  • 选项:

  • -c comment 指定一段注释性描述 

  • -d 目录 指定用户主目录,如果目录不存在,则同时使用 -m选项,可以创建主目录。

  • -g 用户组 指定用户所属的用户组。

  • -G 用户组,指定用户所属的附加组。

  • -s Shell文件 指定用户的登录Shell

  • -u 用户号 指定用户的用户号


    • 创建用户

  • #useradd  tom


    • 查看用户信息

  • #id tom     ->显示UID/GID以及tom还属于哪些组

  • [root@localhost ~]# useradd tom

  • [root@localhost ~]# id tom

  • uid=500(tom) gid=500(tom) groups=500(tom)


    • 创建用户,指定其UID为800

  • [root@localhost ~]# useradd -u 800 jerry

  • [root@localhost ~]# id jerry

  • uid=800(jerry) gid=800(jerry) groups=800(jerry)


    • 添加用户lucy,并设置他的个人主目录练习

  • # useradd –d /usr/lucy -m lucy

  • 此命令创建了一个用户lucy,其中-d-m选项用来为登录名lucy产生一个主目录/usr/lucy/home为默认的用户主目录所在的父目录)。


    • 创建用户gm,指定他属于主用户组“jerry”,附加组“adm、root”,登录使用的shell是/bin/sh

  • [root@localhost ~]# useradd -s /bin/sh -g jerry -G adm,root gm

  • [root@localhost ~]# id gm

  • uid=801(gm) gid=800(jerry) groups=800(jerry),0(root),4(adm)

  • 此命令新建了一个用户gm,该用户的登录Shell/bin/sh,它属于jerry用户组,同时又属于admroot用户组,其中jerry用户组是其主组。


    • 创建用户(伪用户),没有可登陆的shell  (没有可登录的shell意味着什么?)

  • [root@localhost ~]# useradd -s /sbin/nologin alice

  • [root@localhost ~]# su -tom

  • [tom@localhost ~]$ exit

  • [root@localhost ~]# su -alice

  • This account is currently not available.


    • 增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等

  • 2.用户管理—修改用户


    • 修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
    • 修改已有用户的信息使用usermod命令,其格式如下:
    • usermod  [选项]  用户名
    • 常用的选项包括-c, -d, -m, -g, -G, -s, -u等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。
    • 另外,这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
    • usermod -l newUserName oldUserName    # 英文的小写L

  • usermod -l newUserName -d /home/newUserName -m oldUserName

  • 练习:shell修改为bash,用户组(主组)改为root,将用户gm登陆

  • [root@localhost ~]# usermod -s /bin/bash -g root gm

  • 然后通过 id gm命令查看用户组是否成功修改为root

  • 通过查看etc/passwd文件内容gm的登陆shell是否修改为/bin/bash

  • 3.用户口令的管理

  •   ​用户管理的一项重要内容就是用户口令的管理。用户刚创建的时候没有口令,但是被系统锁定,无法使用,必须为其制定口令后才可以使用,即使是制定空的口令。

  • 指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

  • passwd [选项] 用户名

  • 可使用的选项:

  • •​  ​-l(lock) 锁定口令,即禁用账号。

  • •​  ​-u(unlock) 口令解锁。

  • •​  ​-d(HOME_DIR) 使账号无口令(删除密码)。(此命令仅管理员有效)

  • 4.修改密码

  • #passwd   ->修改自己的密码(普通用户修改比较麻烦,)

  • #passwd​   ​tom->修改tom的密码(管理员才可以修改其他人的密码)不需要使用高强度密码

  • 要使用高强度密码

  • 注:高强度密码不是够长就行!!!

  • 5.切换用户 (有可能会被作为面试题)

  • #su  -  目标用户      管理员切用户不需要密码,用户切管理员需要输入自己的密码

  • #CentOS(其他版本的Linux未测试)普通用户切换root用户只需要输入 su 回车后输入root密码即可切换到root用户的身份。

  • 6.用户管理—删除用户


    • 删除用户 

  • #userdel  用户名     删除指定的用户

  • [root@localhost ~]# userdel alice

  • [root@localhost ~]# ls /home/

  • alice  demo  ds  jerry  mengxb  tom  zs

  • [root@localhost ~]# rm -rf /home/alice/

  • [root@localhost ~]# ls /home/

  • demo  ds  jerry  mengxb  tom  zs

  • #userdel  -r   用户名   在删除指定用户的同时删除他的home目录(工作中不建议使用,一个用户离职后,用户可以删掉,但是他的工作文件很可能还有用)

  • 7.用户组管理

  • 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

  • 用户组的管理涉及用户组的添加、删除和修改,实际上就是对/etc/group文件的更新

  • 用户组管理—添加


    • 其格式如下:
    • groupadd [选项]  用户组
    • 可以使用的选项有:

  • -g GID 指定新用户组的组标识号(GID)。

  • -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。


    • 主组、附件组
    • 添加用户组emp

  • #groupadd emp


    • 添加用户组market,并指定标识号为8000

  • #groupadd –g  8000  market


    • 将用户添加到附加组

  • #usermod –aG  market   tom   a:append  G:附加组)


    • 创建一个用户组与root用户组GID
    • # groupadd –g 0 –o testroot

  • 用户组管理—删除


    • 从系统中删除组group1
    • 如果删除的用户组,已经被用户追加为附件组,对应的所有用户的该附件组会被撤销掉。
    • # groupdel group1
    • 如果被删除的用户组,已经被用户指定为主组,则该用户组无法被删除。(可以理解为像Windows中文件被占用时不能被删除。)

  • 用户组管理—修改


    • 其语法如下:
    • groupmod  [选项]  用户组
    • 常用的选项有:

  • -g GID 为用户组指定新的组标识号。

  • -o -g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。

  • -n​  ​新用户组名 将用户组的名字改为新名字

  • (改名格式,groupmod –n newGroupName oldGroupName)


    • 练习1:将组group2的组标识号修改为102

  • # groupmod -g 102 group2


    • 练习2:将组group2的标识号改为10000,组名修改为group3

  • # groupmod –g 10000 -n group3 group2

  • 用户组管理—当前用户切换用户组


    • 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。
    • 用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
    • $ newgrp root
    • 这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组
    • 此时直接输入id后可直接查看到用户的当前组已被切换(但注意这里成为组内成员并不代表拥有了root权限,想像一下你的情书是否愿意让组员查看。)
    • [mengxb@CentOS ~]$ id
    • uid=500(mengxb) gid=0(root) 组=500(mengxb),0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

  • 8.用户账号有关的系统文件详细介绍


    • [root@localhost ~]# cat /etc/passwd

  • gm:x:802:0::/home/z:/bin/bash

  • tom:x:803:803::/home/tom:/bin/bash


    • /etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:
    • 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    • 1、"用户名"是代表用户账号的字符串。

  • 通常长度不超过8个字符,并且由大小写字母或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。

  • 为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。


    • 2、“口令”一些系统中,存放着加密后的用户口令。

  • 虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。


    • 3、“用户标识号”是一个整数,系统内部用它来标识用户。

  • 一般情况下它与用户名是一 一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录 Shell等。

  • 通常用户标识号的取值范围是0655350是超级用户root的标识号,1499由系统保留,作为管理账号,普通用户的标识号从500开始。在Linux系统中,这个界限是65535


    • 4、“组标识号”字段记录的是用户所属的主用户组。

  • 它对应着/etc/group文件中的一条记录。


    • 5、“注释性描述”字段记录着用户的一些个人情况。

  • 例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。


    • 6、“主目录”,也就是用户的起始工作目录。

  • 它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对权限,其他用户对此目录的访问权限则根据具体情况设置。自己的主目录有读、写、执行(搜索)


    • 7、用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

  • Shell是用户与Linux系统之间的接口。LinuxShell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell) 等。

  • 系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh(bash)为默认的登录Shell,即这个字段的值为/bin/sh(或/bin/bash)。

  • 用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

  • 利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。


    • 8、系统中有一类用户称为伪用户(psuedo users)。
    • 这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录shell为空(或/sbin/nologin)。它们存在的原因主要是方便系统管理,满足相应的系统进程对文件属主的要求。
    • 常见的伪用户如下所示:
    • 伪用户名       含义
    • bin     拥有可执行的用户命令文件
    • sys     拥有系统文件
    • adm     拥有帐户文件
    • uucp     UUCP使用
    • lp lp或lpd    子系统使用
    • nobody     NFS使用
    • /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据(内容)自动产生,它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开。这些字段是:mengxb:$1$P3i2zUCl$QxgXUAArJQhNWFxl0EFaD1:17365:0:99999:7:::

  • 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志


    • 1."登录名"是与/etc/passwd文件中的登录名相一致的用户账号
    • 2.“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { $./0-9A-Za-z }中的字符,则对应的用户不能登录。
    • 3.“自创建密码时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能最后一次修改时间”表示的是从某个不一样。例如在SCO Linux 中,这个时间起点是1970年1月1日。(最近一次修改的日期)
    • 4.“最小时间间隔”指的是两次修改口令之间所需的最小天数。(自上次修改密码后多久之内不能被修改)
    • 5.“最大时间间隔”指的是口令保持有效的最大天数。(密码最久使用的时间)
    • 6.“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。(密码到期前提醒修改的时间。)
    • 7.“不活动时间”表示密码失效后,但账号仍能保持有效的最大天数。(密码过期后最多几天内还能登录或着理解为密码过期后的存活期)
    • 8.“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。(密码无效时间)
    • 下面是/etc/shadow的部分内容:

  • [root@localhost ~]# cat /etc/shadow root:$1$wLLDHgEB$A6lPm6zobBrbncPDvKajb1:17206:0:99999:7:::

  • bin:*:15980:0:99999:7:::

  • daemon:*:15980:0:99999:7:::

  • adm:*:15980:0:99999:7:::


    • 用户组的所有信息都存放在/etc/group文件中。
    • 将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。
    • 每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。
    • 当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。
    • 用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。 mkt:x:8888:gm
    • 用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc/passwd文件,由冒号(:)隔开若干个字段,这些字段有:

      • 组名:口令:组标识号:组内用户列表
      • 1."组名"是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
      • 2."口令"字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
      • 3."组标识号"与用户标识号类似,也是一个整数,被系统内部用来标识组。
      • 4."组内用户列表"是属于这个组的所有用户的列表/b],不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。



  • 二、权限

  • -rw-r--r--. 1   root   root    passwd

  • [root@localhost demo]# cp /etc/passwd .

  • [root@localhost demo]# ll passwd  (ls –l passwd)

  • -rw-r--r--. 1 root root 1765 Jan  3 03:24 passwd

  • [root@localhost demo]# su mengxb

  • [mengxb@localhost demo]$ tail -2 passwd    #显示后两行

  • jerry:x:800:800::/home/jerry:/bin/bash

  • liubei:x:801:801::/home/liubei:/bin/bash

  • [mengxb@localhost demo]$ echo 'good bye' >> passwd

  • bash: passwd: Permission denied

  • 权限之—逻辑权限修改


    • 权限修改需要使用的命令是:chmod
    • 权限对应的数字权限:

      • r = 4  (读)
      • w = 2  (写)
      • x = 1  (执行)


  • 如果你看到了一个文件的权限为:- rwx   r-x  r--  *.txt

  •   ​​                                                             ​​ ​user  group  other

  • 该文件的数字权限为:754,其含义为:用户拥有读、写、执行的权限,用户组拥有读、执行,其他人仅拥有读的权限。

  • 权限—思考题

  • 在工作中有的时候偶尔会发现即使是root用户也不能修改某个文件。这是怎么回事?

  • 是因为没有给rw权限吗?

  • 是因为文件的属主不是root

  • 还是该文件不属于任何人?

  • 权限之—物理权限的修改


    • chattr命令

      • 此命令可以用来锁定某个文件不能被修改。系统内核2.6以上的版本支持。
      • 可以通过此命令来修改文件的物理属性从而提高系统的安全性。
      • 但不能修改保护/  、 /dev 、 /tmp 、 /var目录。
      • 命令用法:


  • chattr [ -RVf ] [ -v version ] [ mode ] files…


    • 选项:


    • a:让文件或目录仅供附加用途;
    • i:不得任意更动文件或目录;
    • s:保密性删除文件或目录;(直接删除硬盘上的数据)
    • S:即时更新文件或目录;(直接存入硬盘计算机工作原理其中之一是先写入缓存,再写入硬盘)
    • u:预防意外删除。(数据依然存在硬盘上,可用于数据恢复)
    • -R:递归处理,将指令目录下的所有文件及子目录一并处理;
    • -v<版本编号>:设置文件或目录版本;
    • -V:显示指令执行过程;
    • +<属性>:开启文件或目录的该项属性;
    • -<属性>:关闭文件或目录的该项属性;

  • =<属性>:指定文件或目录的该项属性;


    • 实例:

      • 防止系统中的某个关键文件被修改


  • chattr +i /etc/fstab


    • 将home目录下的文件和目录设置为不允许任何人修改

  • chattr -R +i /home


    • 让某个文件只能追加内容,不能删除

  • chattr +a /root/install.log

  • 权限之—物理权限查看


    • lsattr命令列出文件的隐藏属性。其语法格式为:

  • lsattr [ -RVadv ] [ files… ]


    • 选项:

  • -R    递归显示目录下所有子目录和文件的属性

  • -V    显示lsattr程序的版本信息

  • -a    显示所有文件的属性信息,包括以.开头的文件

  • -d    显示目录的属性,而不是目录下的文件的属性

  • -v    显示文件的档案号码


    • 实例:

      • 显示某文件隐藏的物理权限(属性):


  • lsattr /root/install.log

  • -----a-------e- /root/install.log


    • 其中的a表示文件只可被追加,不能被删除。
    • e是ext文件系统的属性,表示文件的存储单位是extent(区段),此属性仅作了解即可。

  • 权限之—普通用户的root权限

  • 工作中一般体质健全的公司通常不会允许工作人员使用root账户,这样可以保证root密码的安全。

  • 但有些时候我们却又要用到root权限该怎么办?


    • sudo命令(SuperUser Do)
    • 通过修改/etc/sudoers文件使普通用户可以执行sudo命令。该命令代表着root执行。
    • 好处:

  • 使用自己配置好的用户环境

  • 不需要知道root密码,保证root的密码安全,不用让root裸奔

  • 避免root账户引起管理员之间的恶性冲突、流血事件

  • 可以限制用户执行有限的root权限

  • sudo执行的每条命令都会被记录,便于日后的日志审计,例如用户执行过高危操作命令


    • 友好的提示:

  • 我们相信您已经收到了本地系统管理员的常规警告。通常归结为以下三点:

  • 1:尊重他人的隐私。

  • 2:在打字前先思考。

  • 3:权力越大,责任越大。

  • #yyds干货盘点#Linux用户、用户组_字段


    • 在/etc/sudoers文件的第98行下面添加用户名,例如

  • admin   ALL=(ALL)   ALL