介绍

Linux系统是一个多用户多任务的分时操作系统。

  • Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响
  • 不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
  • 任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。通过建立不同属性的用户,一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
  • 每个用户账号都拥有一个惟一的用户名和各自的口令(密码)。用户在登录系统时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

例如,某台 Linux 服务器上有 4 个用户,分别是 root、www、ftp 和 mysql,在同一时间内,root 用户可能在查看系统日志、管理维护系统;www 用户可能在修改自己的网页程序;ftp 用户可能在上传软件到服务器;mysql 用户可能在执行自己的 SQL 查询,每个用户互不干扰,有条不紊地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如 www 用户不能执行 mysql 用户的 SQL 查询操作,ftp 用户也不能修改 www 用户的网页程序。

用户组:

  • 具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权;
  • 若用户多的时候,则通过建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
  • 将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作

用户和用户组的对应关系有以下 4 种:

  1. 一对一:一个用户可以存在一个组中,是组中的唯一成员;
  2. 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
  3. 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
  4. 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。

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

  1. 用户账号的添加、删除与修改。
  2. 用户口令的管理。
  3. 用户组的管理。

Linux系统用户账号的管理

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。

添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。

而Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统中,每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID),这与文件有拥有者和拥有群组两种属性相对应。即每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会根据 /etc/passwd 和 /etc/group 文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来。

注意:Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd 文件中。而/etc/passwd 文件不能随意修改;


常用命令

useradd指令

作用:添加新的用户账号

基本格式: useradd [选项] 用户名

说明:

  • 选项含义
    -u UID手工指定用户的 UID,注意 UID 的范围(不要小于 500)。
    -d 主目录

    手工指定用户的主目录。

    主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限;

    -c 用户说明手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置;
    -g 组名

    手工指定用户的初始组。

    一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。

    一旦手动指定,则系统将不会在创建此默认的初始组目录。

    -G 组名指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
    -s shell手工指定用户的登录 Shell,默认是 /bin/bash;
    -e 曰期

    指定用户的失效曰期,格式为 “YYYY-MM-DD”。

    也就是 /etc/shadow 文件的第八个字段;

    -o

    允许创建的用户的 UID 相同。

    例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;

    -m

    建立用户时强制建立用户的家目录。

    在建立系统用户时,该选项是默认的;

    -r

    创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。

    由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。

注意:useradd 命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd 和 /etc/login.defs;

useradd 命令创建用户的过程:系统首先读取配置文件 /etc/login.defs 和 /etc/default/useradd,根据定义的规则添加用户,即向/etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成。

即:useradd 命令创建用户的过程,其实就是修改了与用户相关的几个文件或目录

实例1:#创建 lamp 普通用户【在没有特殊要求下,无需使用任何选项即可成功创建用户】

# useraddtom

执行的具体操作如下:

  1. 在 /etc/passwd 文件中创建一行与 lamp 用户相关的数据:

    [root@localhost ~]# grep “lamp” /etc/passwd
    lamp:x:500:500::/home/tom:/bin/bash

    可以看到,用户的 UID 是从 500 开始计算的。同时默认指定了用户的家目录为 /home/tom/,用户的登录 Shell 为 /bin/bash。

  2. 在 /etc/shadow 文件中新增了一行与 lamp 用户密码相关的数据:

    [root@localhost ~]# grep “tom” /etc/shadow
    tom:!!:15710:0:99999:7:::

    当然,这个用户还没有设置密码,所以密码字段是 “!!”,代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等。

  3. 在 /etc/group 文件中创建一行与用户名一模一样的群组:

    [root@localhost ~]# grep “tom” /etc/group
    tom:x:500:

    该群组会作为新建用户的初始组。

  4. 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:

    [root@localhost ~]# grep “tom” /etc/gshadow
    lamp:!::

    当然,我们没有设定组密码,所以这里没有密码,也没有组管理员。

  5. 默认创建用户的主目录和邮箱:

    [root@localhost ~]#ll -d /home/tom/
    drwx—— 3 tom lamp 4096 1月6 00:19 /home/tom/
    [root@localhost ~]#ll /var/spod/mail/tom
    -rw-rw—- 1 tom mail 0 1月6 00:19 /var/spool/mail/tom

    注意这两个文件的权限,都要让 tom用户拥有相应的权限。

  6. 将 /etc/skel 目录中的配置文件复制到新用户的主目录中。

实例2

# useradd –d /home/sam -m sam

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

实例3

# useradd -s /bin/sh -g group –G adm,root gem

此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。


userdel命令

作用:删除帐号;如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

基本格式:userdel 选项 用户名

说明:

  • 常用的选项是 -r,它的作用是把用户的主目录一起删除。

例如:

# userdel -r sam

此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。


usermod命令

作用:修改帐号,即根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

基本格式:usermod 选项 用户名

选项说明:

  • -c 用户说明:修改用户的说明信息,即修改/etc/passwd 文件目标用户信息的第 5 个字段;
  • -d 主目录:修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径;
  • -e 日期:修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改/etc/shadow 文件目标用户密码信息的第 8 个字段;
  • -g 组名:修改用户的初始组,即修改/etc/passwd 文件目标用户信息的第 4 个字段(GID);
  • -u UID:修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID);
  • -G 组名:修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件;
  • -l 用户名:修改用户名称;
  • -L:临时锁定用户(Lock);
  • -U:解锁用户(Unlock),和 -L 对应;
  • -s shell:修改用户的登录 Shell,默认是 /bin/bash。

usermod 命令提供的选项和 useradd 命令的选项相似,因为 usermod 命令就是用来调整使用 useradd 命令添加的用户信息的。
不过,相比 useradd 命令,usermod 命令多了-L 和 -U选项,作用分别与 passwd 命令的 -l 和-u 相同。需要注意的是,并不是所有的 Linux 发行版都包含这个命令,因此,使用前可以使用 man usermod 命令确定系统是否支持。

例如:

# usermod -s /bin/ksh -d /home/z –g developer sam

此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

说明: 如果要删除的用户已经使用过系统一段时间,那么此用户可能在系统中留有其他文件,因此,如果我们想要从系统中彻底的删除某个用户,最好在使用 userdel 命令之前,先通过find -user 用户名命令查出系统中属于该用户的文件,然后在加以删除。


passwd命令

作用:

  • 用户口令的管理;
  • 用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
  • 指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。

基本格式:passwd 选项 用户名

  • 选项:
  • -S:查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
  • -l:暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。仅 root 用户可用;
  • -u:解锁用户,和 -l 选项相对应,也是只能root 用户使用;
  • –stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
  • -n 天数:设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
  • -x 天数:设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
  • -w 天数:设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
  • -i 日期:设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。

如果默认用户名,则修改当前用户的口令。

例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:

$ passwd

Old password:******

New password:*******

Re-enter new password:*******

如果是超级用户root,可以用下列形式指定任何用户的口令:

# passwd sam

New password:*******

Re-enter new password:*******

普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。

为用户指定空口令时,执行下列形式的命令:

# passwd -d sam

此命令将用户 sam 的口令删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。

passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:

# passwd -l sam


chage 命令

作用:可以显示更加详细的用户密码信息,并且和 passwd 命令一样,提供了修改用户密码信息的功能;

基本格式:[root@localhost ~]#chage [选项] 用户名

选项:

  • -l:列出用户的详细密码状态;
  • -d 日期:修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD;
  • -m 天数:修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段;
  • -M 天数:修改密码的有效期,也就是/etc/shadow 文件中的第 5 个字段;
  • -W 天数:修改密码到期前的警告天数,也就是/etc/shadow 文件中的第 6个字段;
  • -i 天数:修改密码过期后的宽限天数,也就是/etc/shadow 文件中的第 7个字段;
  • -E 日期:修改账号失效日期,格式为 YYYY-MM-DD,也就是/etc/shadow 文件中的第 8个字段。

#查看一下用户密码状态
[root@localhost ~]# chage -l lamp
Last password change:Jan 06, 2013
Password expires:never
Password inactive :never
Account expires :never
Minimum number of days between password change :0
Maximum number of days between password change :99999
Number of days of warning before password expires :7

说明:chage 命令除了修改密码信息的功能外,还可以强制用户在第一次登录后,必须先修改密码,并利用新密码重新登陆系统,此用户才能正常使用。

例如,我们创建 lamp 用户,并让其首次登陆系统后立即修改密码,执行命令如下:

#创建新用户 lamp
[root@localhost ~]#useradd lamp
#设置用户初始密码为 lamp
[root@localhost ~]#echo “lamp” | passwd –stdin lamp
#通过chage命令设置此账号密码创建的日期为 1970 年 1 月 1 日(0 就表示这一天),这样用户登陆后就必须修改密码
[root@localhost ~]#chage -d 0 lamp

这样修改完 lamp 用户后,我们尝试用 lamp 用户登陆系统(初始密码也是 lamp):

local host login:lamp
Password:<–输入密码登陆
You are required to change your password immediately (root enforced)
changing password for lamp.<–有一些提示,就是说明 root 强制你登录后修改密码
(current)UNIX password:
#输入旧密码
New password:
Retype new password:
#输入两次新密码


id命令

作用:可以查询用户的UID、GID 和附加组的信息。

语法格式:[root@localhost ~]# id 用户名

[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp)
#能看到uid(用户ID)、gid(初始组ID), groups是用户所在组,这里既可以看到初始组,如果有附加组,则也能看到附加组


su命令

作用:

  • su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。
  • 普通用户之间切换以及普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换;从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。

基本格式:[root@localhost ~]# su [选项] 用户名

选项:

  • -:当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH变量、MAIL 变量等),使用 – 选项可省略用户名,默认会切换为 root 用户。
  • -l:同 – 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。
  • -p:表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
  • -m:和 -p 一样;
  • -c 命令:仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。

注意,使用 su 命令时,有 – 和没有 – 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行(比如service命令)。


whoami 命令和 who am i 命令

作用:

  • 前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名
  • 通常,对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份;另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁;甚至还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认。

语法格式:

[Cyuyan@localhost ~]$ whoami
[Cyuyan@localhost ~]$ who am i

注意:

所谓实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;

有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。
一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。需要注意的是,实际用户和有效用户出现差异,切换用户并不是唯一的触发机制。


Linux系统用户组的管理

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

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


常用命令

groupadd命令

作用:增加一个新的用户组使用。

语法格式:groupadd 选项 用户组

选项说明:

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

实例1:

# groupadd group1

此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

实例2:

# groupadd -g 101 group2

此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。


groupdel命令

作用:如果要删除一个已有的用户组

语法格式:groupdel 用户组

例如:

# groupdel group1

此命令从系统中删除组group1。

注意,不能使用 groupdel 命令随意删除群组。此命令仅适用于删除那些 “不是任何用户初始组” 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除。


groupmod命令

作用:修改用户组的属性使用。

语法格式:groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。
  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
  • -n新用户组 将用户组的名字改为新名字

实例1:

# groupmod -g 102 group2

此命令将组group2的组标识号修改为102。

实例2:

# groupmod –g 10000 -n group3 group2

此命令将组group2的标识号改为10000,组名修改为group3。

说明:用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名,则建议大家先删除旧的,再建立新的。


newgrp命令

作用:如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

语法格式:newgrp 组名

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。

例如:$ newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。


gpasswd 命令

作用:使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

基本格式:[root@localhost ~]# gpasswd 选项 组名

选项功能
 选项为空时,表示给群组设置密码,仅 root 用户可用。
-Auser1,…将群组的控制权交给 user1,… 等用户管理,也就是说,设置 user1,… 等用户为群组的管理员,仅 root 用户可用。
-M user1,…将 user1,… 加入到此群组中,仅 root 用户可用。
-r移除群组的密码,仅 root 用户可用。
-R让群组的密码失效,仅 root 用户可用。
-a user将 user 用户加入到群组中。
-d user将 user 用户从群组中移除。

说明:

除 root 可以管理群组外,可设置多个普通用户作为群组的管理员,但也只能做“将用户加入群组”和“将用户移出群组”的操作。

使用usermod -G命令也可以将用户加入群组,但会产生一个问题,即使用此命令将用户加入到新的群组后,该用户之前加入的那些群组都将被清空;

#以lamp用户登陆系统,并将用户 lamp 和 lamp1 加入group1群组。
[lamp@localhost ~]#gpasswd -a lamp group1
[lamp@localhost ~]#gpasswd -a lamp1 group1
[lamp@localhost ~]#grep “group1” /etc/group
group1:x:506:lamp,lamp1


与用户账号有关的系统文件

完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。


/etc/passwd 文件

Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。

[root@localhost ~]# vi /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologin......

这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。

每行用户信息都以 “:” 作为分隔符,划分为 7 个字段,每个字段所表示的含义如下:

用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

序号名称说明备注
1用户名一串代表用户身份的字符串;

Linux 系统是通过 UID 来识别用户身份,分配用户权限的。

/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系;

2密码“x” 表示此用户设有密码,但不是真正的密码。真正的密码保存在 /etc/shadow 文件中,只有 root 用户可以浏览和操作此文件,最大限度地保证了密码的安全;
注意的是,虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
3UID每个用户都有唯一的一个 UID,Linux 系统通过 UID 来识别不同的用户。

实际上,UID 就是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份

0:超级用户。
1~499:系统用户(伪用户)。默认将此范围的 UID 保留给系统使用。其中1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。
500~65535:普通用户。2.6.x 内核之后的 Linux 系统可以支持 232 个 UID 。

4GID全称“Group ID”,简称“组ID”,表示用户初始组的组 ID 号;

初始组,指用户登陆时就拥有这个用户组的相关权限;只能有一个。

附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限;可以有多个。

初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组;
在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组;

5描述性信息只是用来解释这个用户的意义而已 
6主目录用户登录后有操作权限的访问目录,通常称为用户的主目录;例如,root 超级管理员账户的主目录为 /root,普通用户的主目录为 /home/tom
7默认的ShellShell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁

Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等。

也可以把这个字段理解为用户登录之后所拥有的权限;


/etc/shadow文件

/etc/shadow 文件:用于存储 Linux 系统中用户的密码信息,又称为“影子文件”;

注意,如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。

[root@lhyEdu ~]# vim /etc/shadowroot:$6$X70umllo/bRDaNQe$RN6khENv0v549./MS77TYyBPTfoqJu4//b5p1VXMhYBeGjGEZHZzoop.7nRGEEH2v/xQnKgzxaCV7wmvqE6CK1::0:99999:7:::bin:*:17834:0:99999:7:::daemon:*:17834:0:99999:7:::adm:*:17834:0:99999:7:::lp:*:17834:0:99999:7:::sync:*:17834:0:99999:7:::......

同 /etc/passwd 文件一样,文件中每行代表一个用户,同样使用 “:” 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

序号名称说明备注
1用户名同 /etc/passwd 文件的用户名有相同的含义
2加密密码目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法注意,这串密码产生的乱码不能手工修改;
所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。
3最后一次修改时间Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间可以使用如下命令换算为我们习惯的系统日期。
[root@localhost ~]# date -d “1970-01-01 15775 days”
2013年03月11日 星期一 00:00:00 CST
4最小修改时间间隔该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。

如果是 0,则密码可以随时修改;

如果是 10,则代表密码修改后 10 天之内不能再次修改密码。

5密码有效期这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。

该字段的默认值为 99999,也就是 273 年,可认为是永久生效。

如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。

管理服务器时,通过这个字段强制用户定期修改密码。

6密码需要变更前的警告天数与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒账户重置密码该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
7密码过期后的宽限时间也称为“口令失效日”在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
8账号失效时间同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!
该字段通常被使用在具有收费服务的系统中。
9保留字段这个字段目前没有使用,等待新功能的加入。

/ect/group 文件

/ect/group 文件:用户组配置文件,即用户组的所有信息都存放在此文件中。此文件是记录组 ID(GID)和组名相对应的文件。

/etc/group 文件的内容可以通过 Vim 看到:

[root@localhost ~]#vim /etc/grouproot:x:0:bin:x:1:bin,daemondaemon:x:2:bin,daemon…省略部分输出…lamp:x:502:

可以看到,此文件中每一行各代表一个用户组。在前面章节中,我们曾创建 lamp 用户,系统默认生成一个 lamp 用户组,在此可以看到,此用户组的 GID 为 502,目前它仅作为 lamp 用户的初始组。

各用户组中,还是以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为:

组名:密码:GID:该用户组中的用户列表

序号名称说明备注
1组名用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复
2密码和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。

用户组密码主要是用来指定组管理员的;

如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。

但是这项功能目前很少使用;

如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

3GID群组的 ID 号

Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。

这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

4该用户组中的用户列表此字段列出每个群组包含的所有用户注意的是:该字段显示的用户都是这个用户组的附加用户。

/etc/passwd、/etc/shadow、/etc/group的关系:

  • 即先在 /etc/group 文件中查询用户组的 GID 和组名;
    • 然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;
      • 最后通过 UID 到 /etc/shadow 文件中提取和这个用户相匹配的密码。

/etc/passwd 文件

组用户的密码信息存储在 /etc/gshadow 文件,此文件内容如下:

[root@localhost ~]#vim /etc/gshadowroot:::bin:::bin, daemondaemon:::bin, daemon...省略部分输出...lamp:!::

文件中,每行代表一个组用户的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下:

组名:加密密码:组管理员:组附加用户列表

序号名称说明备注
1组名同 /etc/group 文件中的组名相对应。 
2组密码对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。 
3组管理员由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用 
4组中的附加用户该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。