第6章 Linux用户和用户组管理

 


1.Linux /etc/passwd2.Linux /etc/shadow文件3.Linux /etc/group4.Linux /etc/gshadow5.Linux useradd命令6.Linux passwd命令7.Linux usermod命令8.Linux chage命令9.Linux userdel命令10.Linux id命令11.Linux su命令12.Linux groupadd命令13.Linux groupmod命令14.Linux groupdel命令15.Linux gpasswd命令16.Linux newgrp命令17.Linux用户管理命令

用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。

可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机来讲问题不大,但在服务器上是行不通的。

大家想象一下,我们是一个管理团队,共同维护一组服务器,难道每个人都能够被赋予管理员权限吗?显然是不行的,因为不是所有的数据都可以对每位管理员公开,而且如果在运维团队中有某位管理员对 Linux 不熟悉,那么赋予他管理员权限的后果可能是灾难性的。
因此,越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。

这个文件中保存的就是系统中所有的用户和用户的主要信息。我们打开这个文件来看看内容到底是什么。

[root@localhost ~]# vi /etc/passwd
#查看一下文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...

这个文件的内容非常规律,每行代表一个用户。大家可能会比较惊讶,Linux 系统中默认怎么会有这么多的用户啊!这些用户中的绝大多数是系统或服务正常运行所必需的用户,我们把这种用户称为系统用户或伪用户。系统用户是不能登录系统的,但是这些用户同样也不能被删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。

现在我们就把 root 用户这一行拿出来,具体分析这个文件中的内容具体代表的含义。可以注意到,这个文件用":"作为分隔符,划分为 7 个字段,我们逐个来看具体的含义。

用户名称#

第一个字段中保存的是用户名称。不过大家需要注意,用户名称只是为了方便管理员记忆,Linux 系统是通过用户 ID (UID) 来区分不同用户、分配用户权限的。而用户名称和 UID 的对应正是通过 /etc/passwd 这个文件来定义的。

密码标志#

这里的"x"代表的是密码标志,而不是真正的密码,真正的密码是保存在 /etc/shadow 文件中的。在早期的 UNIX 中,这里保存的就是真正的加密密码串,但是这个文件的权限是 644,查询命令如下:

[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1648 12月29 00:17 /etc/passwd

所有用户都可以读取 /etc/passwd 文件,这样非常容易导致密码的泄露。虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。所以现在的 Linux 系统把真正的加密密码串放置在影子文件/etc/shadow中,而影子文件的权限是 000,查询命令如下:

[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1028 12月29 00:18 /etc/shadow

这个文件是没有任何权限的,但因为我是 root 用户,所以读取权限不受限制。当然,用强制修改的方法也是可以手工修改这个文件的内容的。只有 root 用户可以浏览和操作这个文件,这样就最大限度地保证了密码的安全。

所以在 /etc/passwd 中只有一个"x"代表用户是拥有密码的,我们把这个字段称作密码标志,具体的密码要去 /etc/shadow 文件中查询。但是这个密码标志"x"也是不能被删除的,如果删除了密码标志"x",那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(当然只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。

UID#

第三个字段就是用户 ID(UID),我们已经知道系统是通过 UID 来识别不同的用户和分配用户权限的。这些 UID 是有使用限制和要求的:

  1. 0:超级用户 UID。如果用户 UID 为 0,则代表这个账号是管理员账号。在 Linux 中如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
  2. 1~499:系统用户(伪用户)UID。这些 UID 是系统保留给系统用户的 UID,也就是说 UID 是 1~499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中,1~99 是系统保留的账号,系统自动创建;100~499 是预留给用户创建账号的。
  3. 500~65535:普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。


这些用户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的 Linux 系统用户 UID 已经可以支持 232 个用户了。

GID#

第四个字段就是用户的组 ID(GID),也就是这个用户的初始组的标志号。这里需要解释一下初始组和附加组的概念。

所谓初始组,指用户一登陆录就立刻拥有这个用户组的相关权限。每个用户的初始组只能有一个,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。举例来说,我们手工添加用户 lamp,在建立用户 lamp 的同时就会建立 lamp 组作为 lamp 用户的初始组。

所谓附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组要把用户再加入其他的用户组外,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。

举例来说,刚刚的 lamp 用户除属于初始组 lamp 外,我又把它加入了 users 组,那么 lamp 用户同时属于 lamp 组、users 组,其中 lamp 是初始组,users 是附加组。当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。

需要注意的是,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组。

用户说明#

第五个字段是这个用户的简单说明,没有什么特殊作用,可以不写。

家目录#

第六个字段是这个用户的家目录,也就是用户登录后有操作权限的访问目录,我们把这个目录称为用户的家目录。

超级用户的家目录是 /root 目录,普通用户在 /home/ 目录下建立和用户名相同的目录作为家目录,如 lamp 用户的家目录就是 /home/lamp/ 目录。

登录之后的Shell#

Shell 就是 Linux 的命令解释器。管理员输入的密码都是 ASCII 码,也就是类似 abcd 的英文。但是系统可以识别的编码是类似 0101 的机器语言。Shell 的作用就是把 ASCII 编码的命令翻译成系统可以识别的机器语言,同时把系统的执行结果翻译为用户可以识别的 ASCII 编码。Linux 的标准 Shell 就是 /bin/bash。

在 /etc/passw 文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果写入的是 Linux 的标准 Shell,/bin/bash 就代表这个用户拥有权限范围内的所有权限。例如:

[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash

我手工添加了 lamp 用户,它的登录 Shell 是 /bin/bash,那么这个用户就可以使用普通用户的所有权限。如果我把 lamp 用户的 Shell 修改为 /sbin/nologin,例如:

[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/sbin/nologin

那么这个用户就不能登录了,因为 /sbin/nologin 就是禁止登录的 Shell。这样说明白了吗?如果我在这里放入的系统命令,如 /usr/bin/passwd,例如:

[root@localhost ~]#vi /etc/passwd
lamp:x:502:502::/home/lamp:/usr/bin/passwd

那么这个用户可以登录,但登录之后就只能修改自己的密码了。这里不能随便写入和登陆没有关系的命令,如 ls,否则系统不会识别这些命令,也就意味着这个用户不能登录。

这个文件中保存着用户的实际加密密码和密码有效期等参数。我们已经知道这个文件的权限是 000,所以保存的实际加密密码除 root 用户外,其他用户是不能查看的,这样做有效地保证了密码的安全。如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。

我们打开这个文件看看,例如:

[root@localhost ~]#vi /etc/shadow
root: $6$9w5Td6lg
$bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1 PzdcXmixzhnMVhMxbvO:15775:0:99999:7:::
bin:*:15513:0:99999:7:::
daemon:*:15513:0:99999:7:::
…省略部分输出…

这个文件的每行代表一个用户,同样使用":"作为分隔符,划分为 9 个字段。我们以 root 行为例,这 9 个字段的作用如下。

用户名称#

第一个字段中保存的是用户名称,和 /etc/passwd 文件的用户名称相对应。

密码#

第二个字段中保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,而原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。注意:这串密码产生的乱码不能手工修改,如果手工修改,就会算不出原密码,导致密码失效。

当然,我们也可以在密码前人为地加入"!"或"*"改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。

注意,所有伪用户的密码都是"!!"或"*",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是"!!",代表这个用户没有密码,不能登录。

密码最后一次修改曰期#

第三个字段是密码的修改日期,可是这里怎么是 15775 啊?代表什么意思呢?其实 Linux 更加习惯使用时间戳代表时间,也就是说,以 1970 年 1 日 1 日作为标准时间,每过去一天时间戳加 1,那么 366 代表的就是 1971 年 1 月 1 日。

我们这里的时间戳是 15775,也就是说,是在 1970 年 1 月 1 日之后的第 15775 天修改的 root 用户密码。好隐晦的表示啊!那么,到底 15775 的时间戳代表的是哪一天呢?我们可以使用如下命令进行换算:

[root@localhost ~]# date -d "1970-01-01 15775 days"
2013年03月11日 星期一 00:00:00 CST

用以上命令可以把时间戳换算为我们习惯的系统日期,那么我们可以把系统日期换算为时间戳吗?当然可以,命令如下:

[root@localhost ~]# echo $(($(date--date="2013/03/11" +%s)/86400+1))
15775

这里的 2013/03/11 是你要计算的曰期,+%s 是把当前日期换算成自 1970 年 1 月 1 日以来的总秒数,除以 86400(每天的秒数),最后加上 1 补齐 1970 年 1 月 1 日当天就能计算出时间戳了。其实不需要理解这里的命令,只要知道时间戳的概念就好,如果需要换算就套用命令。

密码的两次修改间隔时间(和第三个字段相比)#

第四个字段是密码的两次修改间隔时间。这个字段要和第三个字段相比,也就是说密码被修改后多久不能再修改密码。如果是 0,则密码可以随时修改。如果是 10,则代表密码修改后 10 天之内不能再次修改这个密码。

密码的有效期(和第三个字段相比)#

第五个字段是密码的有效期。这个字段也要和第三个字段相比,也就是说密码被修改后可以生效多少天。默认值 99999,也就是 27 年,大家可以认为永久生效。如果改为 90,那么密码被修改 90 天之后就必须再次修改,否则该用户就不能登录了。我们在管理服务器的时候可以通过这个字段强制用户定期修改密码。

密码修改到期前的警告天数(和第五个字段相比)#

第六个字段是密码修改到期前的警告天数。这个字段要和第五个字段相比,就是密码到期前需提前几天修改。默认值是7,也就是说从密码到期前的 7 天开始,每次登录系统都会警告该用户修改密码。

密码过期后的宽限天数(和第五个字段相比)#

第七个字段是密码过期后的宽限天数。也就是密码过期后,用户如果还是没有修改密码,那么在宽限天数内用户还是可以登录系统的;如果过了宽限天数,那么用户就无法再使用该密码登录了。天数如果是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

账号失效时间#

第八个字段是用法的账号失效时间。这里同样要写时间戳,也就是用 1970 年 1 日 1 日进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效,无法使用了。

保留#

这个字段目前没有使用。

小提示:在 Linux 中,如果遗忘了密码,则可以启动进入单用户模式。这时既可以删除 /etc/passwd 文件中的密码标识字段,也可以删除 /etc/shadow 文件中的密码标识字段,都可以达到清空密码的目的。

这个文件是记录组 ID(GID) 和组名的对应文件。etc/passwd 文件的第四个字段记录的是每个用户的初始组的 ID,那么这个 GID 的组名到底是什么呢?就要从 /etc/group 文件中查找。这个文件的内容如下:

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

我们手工添加的用户 lamp 也会默认生成一个 lamp 用户组,GID 是 502,作为 lamp 用户的初始组。这个文件用":"作为分隔符,划分为 4 个字段。我们以 root 行为例子讲解每个字段的具体含义。

组名#

第一个字段是组名字段,也就是用户组的名称字段。

组密码标志#

第二个字段是组密码标志字段。和 /etc/passwd 文件一样,这里的"x"仅仅是密码标识,真正的加密之后的组密码保存在 /etc/gshadow 文件中。

不过,用户设置密码是为了验证用户的身份,但是用户组设置密码是用来做什么的呢?用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

组ID (GID)#

第三个字段是用户组的 ID,和 UID 一样,Linux 系统是通过 GID 来区别不同的用户组的,组名只是为了便于管理员识别。所以,在 /etc/group 文件中可以查看对应的组名和GID。

组中的用户#

第四个字段表示的就是这个用户组中到底包含了哪些用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段。也就是说,写入这个字段的用户是这个用户组的附加用户。比如 lamp 组就是这样写的"lamp:x:502",并没有在第四个字段中写入 lamp 用户,因为 lamp 组是 lamp 用户的初始组。如果要查询这些用户的初始组,则需要先到 /etc/passwd 文件中查看 GID(第四个字段),然后到 /etc/group 文件中比对组名。

每个用户都可以加入多个附加组,但是只能属于一个个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要添加附加组。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。

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

这个文件就是保存组密码的文件。如果我们给用户组设定了组管理员,并给该用户组设定了组密码,那么组密码就保存在这个文件中,组管理员就可以利用这个密码管理者个用户组了。

该文件的内容如下:

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

这个文件使用":"作为分隔符,把文件划分为 4 个字段,每个字段的含义如下。

组名#

第一个字段是这个用户的组名。

组密码#

第二个字段就是实际加密的组密码。注意,对于大多数用户来说,这个字段不是空就是"!",代表这个组没有合法的组密码。

组管理员用户名#

第三个字段表示这个组的管理员是哪个用户。

组中的附加用户#

第四个字段用于显示这个用户组中有哪些附加用户。

添加用户的命令是 useradd,命令格式如下:

[root@localhost ~]#useradd [选项] 用户名

选项:

  • -u UID: 手工指定用户的 UID,注意手工添加的用户的 UID 不要小于 500;
  • -d 家目录:手工指定用户的家目录。家目录必须写绝对路径,而且如果需要手工指定家目录,则一定要注意权限;
  • -c 用户说明:手工指定用户说明。还记得 /etc/passwd 文件的第五个字段吗?这里就是指定该字段内容的;
  • -g 组名:手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。如果不想使用默认初始组,则可以用 -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:建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;

添加默认用户#

如果我们只是创建用户,则可以不使用任何选项,系统会按照默认值帮我们指定这些选项,只需要最简单的命令就可以了。命令如下:

【例 1】添加用户

[root@localhost ~]# useradd lamp

那么,这条命令到底做了什么呢?我们依次来看看。

1) 在 /etc/passwd 文件中按照文件格式添加 lamp 用户的行。

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

注意,用户的 UID 是从 500 开始计算的。同时默认指定了用户的家目录为 /home/lamp/,用户的登录 Shell 为 /bin/bash。

2) 在 /etc/shadow 文件中建立用户 lamp 的相关行。

[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!!:15710:0:99999:7:::

当然,这个用户还没有设置密码,所以密码字段是"!!",代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段。

3) 在 /etc/group 文件中建立和用户 lamp 相关的行。

[root@localhost ~]# grep "lamp" /etc/group lamp:x:500:

因为 lamp 组是 lamp 用户的初始组,所以 lamp 用户名不会写入第四个字段。

4) 在 /etc/gshadow 文件中建立和用户 lamp 相关的行。

[root@localhost ~]# grep "lamp" /etc/gshadow lamp:!::

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

5)默认建立用户的家目录和邮箱。

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

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

大家看到了吗? useradd 命令在添加用户的时候,其实就是修改了我们在前面介绍的 7 个文件或目录,那么我们可以通过手工修改这些文件来添加或删除用户吗?当然可以了,我们在后面会演示如何通过手工修改文件来删除用户。

那什么时候需要手工建立用户?什么时候需要用命令建立用户?其实在任何情况下都不需要手工修改文件来建立用户,我们用命令来建立用户既简便又快捷。我们在这里只是为了说明 Linux 中的所有内容都是保存在文件中的。

手工指定选项添加用户#

刚刚我们在添加用户的时候全部采用的是默认值,那么我们使用选项来添加用户会有什么样的效果?

【例 2】

[root@localhost ~]# groupadd lampl
#先手工添加lamp1用户组,因为我一会儿要把lamp1用户的初始迎指定过来,如果不事先建立,则会报告用户组不存在
[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#在建立用户lamp1的同时指定了UID(550)、初始组(lamp1)、附加组(root)、家目录(/home/ lamp1/)、用户说明(test user)和用户登录Shell(/bin/ bash)
[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group
#同时查看三个文件
/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash
#用户的UID、初始组、用户说明、家目录和登录Shell都和命令手工指定的一致
/etc/shadow:lamp1:!!:15710:0:99999:7:::
#lamp1用户还没有设定密码
/etc/group:root:x:0:lamp1
#lamp1用户加入了root组,root组是lamp1用户的附加组
/etc/group:lampl:x:502:
#GID为502的组是lamp1组
[root@localhost ~]#ll -d /home/lamp1/
drwx------ 3 lamp1 lamp1 4096 1月6 01:13 /home/lamp1/
#家目录也建立了,不需要手工建立

例子有点复杂,其实如果可以看懂还是很简单的,就是添加了用户,但是不再使用用户的默认值,而是手工指定了用户的 UID(是 550,而不再是 501)、初始组、附加组、家目录、用户说明和用户登录 Shell。这里还要注意一点,虽然手工指定了用户的家目录,但是家目录不需要手工建立,在添加用户的同时会自动建立家目录。如果手工建立了家目录,那么一定要修改目录的权限和从 /etc/skel/ 模板目录中复制环境变量文件,反而更加麻烦。

useradd命令的默认值设定#

大家发现了吗?在添加用户时,其实不需要手工指定任何内容,都可以使用 useradd 命令默认创建,这些默认值已经可以满足我们的要求。但是 useradd 命令的这些默认值是保存哪里的呢?能否手工修改呢?

useradd 命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd 和 /etc/login.defs。我们先看看 /etc/default/useradd 文件的内容。

[root@localhost ~]#vi /etc/default/useradd
# useradd defaults file
GR0UP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

逐行解释一下:

  • GR0UP=100:这个选项用于建立用户的默认组,也就是说,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但是我们已经知道 CentOS 并不是这样的,而是在添加用户时会自动建立和用户名相同的组作为这个用户的初始组。也就是说这个选项并没有生效,因为 Linux 中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。目前我们采用的是私有用户组机制。
  • HOME=/home:这个选项是用户的家目录的默认位置,所以所有新建用户的家目录默认都在 /home/ 下。
  • INACTIVE=-1:这个选项是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。其作用是在密码过期后,如果用户还是没有修改密码,那么在宽限天数内用户还是可以登录系统的;如果过了宽限天数,那么用户就无法再使用该密码登录了。这里默认值是 -1,代表所有新建立的用户密码永远不会失效。
  • EXPIRE=:这个选项是密码失效时间,也就是 /etc/shadow 文件的第八个字段。也就是说,用户到达这个日期后就会直接失效。当然这里也是使用时间戳来表示日期的。默认值是空,代表所有新建用户没有失效时间,永久有效。
  • SHELL=/bin/bash:这个选项是用户的默认 Shell。/bin/bash 是 Linux 的标准 Shell,代表所有新建立的用户默认 Shell 都是 /bin/bash。
  • SKEL=/etc/skel:这个选项用于定义用户的模板目录的位置,/etc/skel/ 目录中的文件都会复制到新建用户的家目录中。
  • CREATE_MAIL_SPOOL=yes:这个选项定义是否给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。


当然,这个文件也可以直接通过命令进行查看,结果是一样的。命令如下:

[root@localhost ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

选项:

  • -D:查看新建用户的默认值


通过 /etc/default/useradd 文件大家已经能够看到我们新建用户的部分默认值,但是还有一些内容并没有在这个文件中出现,比如用户的 UID 为什么默认从 500 开始计算,/etc/shadow 文件中除第一、二、三个字段不用设定默认值外,还有第四、五、六个字段没有指定默认值(第七、八个字段的默认值在 /etc/default/useradd 文件中指定了)。那么,这些默认值就需要第二个默认值文件 /etc/login.defs 了,这个文件的内容如下:

[root@localhost ~]# vi /etc/login.defs
#这个文件有一些注释,把注释删除,文件内容就变成下面这个样子了
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

我们逐行解释一下文件内容:

  • MAIL_DIR /var/spool/mail:这行指定了新建用户的默认邮箱位置。比如 lamp 用户的邮箱是 /var/spool/mail/lamp。
  • PASS_MAX_DAYS 99999:这行指定的是密码的有效期,也就是 /etc/shadow 文件的第五个字段。代表多少天必须修改密码,默认值是 99999。
  • PASS_MIN_DAYS 0:这行指定的是密码的两次修改间隔时间,也就是 /etc/shadow 文件的第四个字段。代表第一次修改密码之后,几天后才能再次修改密码,默认值是 0。
  • PASS_MIN_LEN 5:这行代表密码的最小长度,默认不小于 5 位。但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
  • PASS_WARN_AGE 7:这行代表密码修改到期前的警告天数,也就是 /etc/shadow 文件的第六个字段。代表密码到达有效期前多少天开始进行警告提醒,默认值是 7 天。
  • UID_MIN 500及UID_MAX 60000:这两行代表创建用户时最小 UID 和最大 UID 的范围。从 2.6.x 内核开始,Linux 用户的 UID 最大可以支持到 232,但是真正使用时最大范围是60000。还要注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用(小于 500 的 UID 是给伪用户预留的)。
  • GID_MIN 500 及 GID_MAX 60000:这两行指定了 GID 的最小值和最大值的范围。
  • CREATE_HOME yes:这行指定建立用户时是否自动建立用户的家目录,默认是建立。
  • UMASK 077:这行指定建立的用户家目录的默认权限,因为 umask 值是 077,所以新建的用户家目录的权限是 700。
  • USERGROUPS_ENAB yes:这行指定使用命令 userdd 删除用户时,是否删除用户的初始组,默认是删除。
  • ENCRYPT_METHOD SHA512:这行指定 Linux 用户的密码使用 SHA5121 散列模式加密。这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。


我们现在已经知道了,系统在默认添加用户时,是靠 /etc/default/useradd 和 /etc/login.defs 文件定义用户的默认值的。如果我们想要修改所有新建用户的某个默认值,就可以直接修改这两个文件,而不用每个用户单独修改了。

前面章节中介绍了添加用户的命令,但是新添加的用户如果不设定密码是不能够登录系统的,本节就来学习一下密码设置命令 passwd。

[root@localhost ~]#passwd [选项] 用户名

选项:

  • -S:査询用户密码的状态,也就是 /etc/shadow 文件中的内容。仅 root 用户可用;
  • -l:暂时锁定用户。仅 root 用户可用;
  • -u:解锁用户。仅 root 用户可用;
  • --stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;

[root@localhost ~]#passwd
#passwd直接回车代表修改当前用户的密码

root用户修改密码#

下面举几个例子,我们给新用户 lamp 设定密码,让 lamp 用户可以登录系统。

【例 1】

[root@localhost ~]# passwd lamp
更改用户lamp的密码。
新的密码:
<-输入新密码
无效的密码:WAY过短
<-有报错提示
无效的密码:过于简单
重新输入新的密码:
<-第二次输入密码
passwd:所有的身份证验证令牌已经成功更新。

注意,要想给其他用户设定密码,只有两种用户可行:一种是 root 用户;另一种是 root 通过 sudo 命令赋予权限的普通用户。也就是说,普通用户只能修改自己的密码,而不能设定其他用户的密码。

还要注意一件事,设定用户密码时一定要遵守"复杂性、易记忆性、时效性"的密码规范。简单来讲就是密码要大于 8 位,包含大写字母、小写字母、数字和特殊符号中的 3 种,并且容易记忆和定期更换。但是 root 用户在设定密码时却可以不遵守这些规则,比如我刚刚给 lamp 用户设定的密码是"123",系统虽然会提示密码过短和过于简单,但是依然可以设置成功。不过普通用户在修改自己的密码时,一定要遵守密码规范。当然,在生产服务器上,就算是 root 身份,在设定密码时也要严格遵守密码规范,因为只有好的密码规范才是服务器安全的基础。

普通用户修改密码#

那么我们看看普通用户 lamp 是如何修改密码的。

【例 2】

[lamp@localhost ~]$ whoami
lamp
#先看看我的身份
[lamp@localhost ~]$ passwd lamp1
passwd:只有根用户才能指定用户名称
#尝试修改lamp用户的密码,系统提示普通用户不能修改其他用户的密码
[lamp@localhost ~]$ passwd lamp
passwd:只有根用户才能指定用户名称。

怎么修改自己的密码也报错呢?这里其实说得很清楚,要想指定用户名修改密码,只有管理员可以,哪怕 # 是修改自己的密码。那么修改自己的密码就只能像下面这样了:

[lamp@localhost ~]$ passwd
#使用passwd直接回车,就是修改自己的密码
更改用户lamp的密码。
为lamp更改STRESS密码。
(当前)UNIX密码:
#注意,普通用户需要先输入自己的密码
新的密码:
无效的密码:它基于字典单词 。
#好吧,又报错了,因为我输入的密码在字典中能够找到
新的密码:
#密码必须符合密码规范
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。

大家发现了吗?对普通用户来讲,密码设定就要严格得多了。首先,只能使用"passwd"来修改自己的密码,而不能使用"passwd 用户名"的方式。不过,如果你是 root 用户,则建议用"passwd 用户名"的方式来修改密码,因为这样不容易搞混。其次,在修改密码之前,需要先输入旧密码。最后,设定密码一定要严格遵守密码规范。

查看用户密码状态#

【例 3】

[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1 (密码已设置,使 用SHA512加密。)
#上面这行代码的意思依次是:用户名 密码 设定时间(2013*01-06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1)

"-S"选项会显示出密码状态,这里的密码修改间 隔时间、密码有效期、警告时间、密码宽限时间其实分别是 /etc/shadow 文件的第四、五、六、七个字段的内容。 当然,passwd 命令是可以通过命令选项修改这几个字段的值的,不过我个人认为还是直接修改 /etc/shadow 文件简单一些。

再次提醒一下,CentOS 6.3 加密方式已经从 MD5 加密更新到 SHA512 加密,我们不用了解具体的加密算法,只要知道这种加密算法更加可靠和先进就足够了。

锁定和解锁用户#

使用 passwd 命令可以很方便地锁定和解锁某个用户,我们来试试。

【例 4】

[root@localhost ~]# passwd -I lamp
#锁定用户lamp的密码。
passwd:操作成功
#锁定用户
[root@localhost ~]# passwd -S lamp
lamp LK 2013-01-06 0 99999 7 -1 (密码已被锁定。)
#用"-S"选项査看状态,很清楚地提示密码已被锁定
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!! $6$ZTq7o/9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.i Yzh9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7:::
#其实锁定就是在加密密码之前加入了"!!"让密码失效而已

可以非常简单地实现用户的暂时锁定,这时 lamp 用户就不能登录系统了。那么解锁呢?也一样简单,我们来试试。

[root@localhost ~]# passwd -u lamp
解锁用户lamp的密码。
passwd:操作成功
#解锁用户
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1 (密码已设置,使用SHA512加密。)
#锁定状态消失
[root@localhost ~]# grep "lamp" /etc/shadow
lamp: $6$ZTq7cV9o $lj07iZ0bzW.D1zBa9CsY43d04onskUCzjwiFMNt8PX4GXJoHX9zA1S C9.iYz h9LZA4fEM2lg92hM9w/p6NS50.:15711:0:99999:7:::
#密码前面的"!!"删除了

使用字符串作为用户的密码#

这种做法主要是批量添加用户时,给所有的用户设定一个初始密码。但是需要注意的是,这样设定的密码会把密码明文保存在历史命令中,会有安全隐患。所以,如果使用了这种方式修改密码,那么应该记住两件事情:第一,手工清除历史命令;第二,强制这些新添加的用户在第一次登录时必须修改密码(具体方法参考"chage"命令)。

【例 5】

[root@localhost ~]# echo "123" | passwd -stdin lamp
更改用户lamp的密码。
passwd:所有的身份验证令牌已成功更新。

命令很简单,调用管道符,让 echo 的输出作为 passwd 命令的输入,就可以把 lamp 用户的密码设定为"123"了。

在添加了用户之后,如果不小心添加错了用户的信息,那么是否可以修改呢?当然可以了,我们可以直接使用编辑器修改用户相关文件,也可以使用 usermod 命令进行修改。

usermod 命令命令的格式如下:

[root@localhost ~]#usermod [选项] 用户名

选项:

  • -u UID:修改用户的UID;
  • -d 家目录:修改用户的家目录。家目录必须写绝对路径;
  • -c 用户说明:修改用户的说明信息,就是 /etc/passwd 文件的第五个字段;
  • -g 组名:修改用户的初始组,就是 /etc/passwd 文件的第四个字段;
  • -G 组名:修改用户的附加组,其实就是把用户加入其他用户组;
  • -s shell:修改用户的登录 Shell。默认是 /bin/bash;
  • -e 日期:修改用户的失效曰期,格式为"YYYY-MM-DD"。也就是 /etc/shadow 文件的第八个字段;
  • -L:临时锁定用户(Lock);
  • -U:解锁用户(Unlock);

可以看到,usermod 和 useradd 命令的选项非常类似,因为它们都是用于定义用户信息的。需要注意的是,useradd 命令用于在添加新用户时指定用户信息,而 usermod 命令用于修改已经存在的用户的用户信息,干万不要搞混。

usermod 命令多出了几个选项,其中,-L 可以临时锁定用户,不让这个用户登录。其实锁定的方法就是在 /etc/shadow 文件的密码字段前加入"!"。大家已经知道密码项是加密换算的,所以加入任何字符都会导致密码失效,所以这个用户就会被禁止登录。而解锁(-U)其实就是把密码字段前的"!"取消。举个例子:

【例 1】

[root@localhost ~]# usermod -L lamp
#锁定用户
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:! $6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSky xlaMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:99999:7:::
#查看发现锁定就是在密码字段前加入"!",这时lamp用户就暂时不能登录了
[root@localhost ~]# usermod -U lamp
#解锁用户
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:$6$YrPj8g0w$ChRVASybEncU24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKVQSkyx laMGs/Eg5AQwO.UokOnKqaHFa/:15711:0:99999:7::
#取消了密码字段前的"!"

再举几个其他的例子:

【例 2】

[root@localhost ~]# usermod -G root lamp
#把lamp用户加入root组
[root@localhost ~]# grep "lamp" /etc/group root:x:0:lamp
lamp:x:501:
#lamp用户已经加入了root组


【例 3】

[root@localhost ~]# usermod -c "test user" lamp #修改用户说明
[root@localhost ~]# grep "lamp" /etc/passwd
lamp:x:501:501:test user:/home/lamp:/bin/bash
#查看一下,用户说明已经被修改了

通过 chage 命令可以查看和修改 /etc/shadow 文件的第三个字段到第八个字段的密码状态。我个人建议直接修改 /etc/shadow 文件更加直观和简单。

那么为什么还要讲解 chage 命令呢?因为 chage 命令有一种很好的用法,就是强制用户在第一次登录时必须修改密码。

chage 命令的格式如下:

[root@localhost ~]#chage [选项] 用户名

选项:

  • -l:列出用户的详细密码状态;
  • -d 日期:密码最后一次修改曰期(/etc/shadow 文件的第三个字段),格式为 YYYY-MM-DD;
  • -m 天数:密码的两次修改间隔时间(第四个字段);
  • -M 天数:密码的有效期(第五个字段);
  • -W 天数:密码修改到期前的警告天数(第六个字段);
  • -i 天数:密码过期后的宽限天数(第七个字段);
  • -E 日期:账号失效时间(第八个字段),格式为 YYYY-MM-DD;

举几个例子,先看一下查看状态。

【例 1】

[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

我们强制 lamp 用户在第一次登陆时必须修改密码。

【例 2】

[root@localhost ~]# chage -d 0 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:
#输入两次新密码

这项功能在进行批量用户管理时还是非常有用的。

这个命令比较简单,就是删除用户。

userdel命令格式如下:

[root@localhost ~]# userdel [-r] 用户名

选项:

  • -r:在删除用户的同时删除用户的家目录;

例如:

[root@localhost ~]# userdel -r lamp

在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件。

前面我们说过,可以手工修改用户的相关文件来建立用户,但在实际工作中,这样做没有实际的意义,因为用户管理命令可以更简单地完成这项工作。在学习时,手工添加用户是有助于加深我们对用户相关文件的理解的。不过手工添加用户还是比较麻烦的,我们变通一下,手工删除用户,原理是一样的,能够手工删除当然也可以手工建立。

例如:

[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立lamp用户
[root@localhost ~]# vi /etc/passwd
lamp:x:501:501::/home/lamp:/bin/bash
<-删除此行
#修改用户信息文件,删除lamp用户行
[root@localhost ~]#vi /etc/shadow
lamp:$6$KoOYtcOJ $56Xk9vp3D2vMRBxibNOn.21cVJ9onbW8IHx4WrOx6qBqfGa9U3mjMsGjqYnj L/4t3zt3YxElce2X8rbb12x4a0:15716:0:99999:7:::
<-删除此行
#修改影子文件,删除lamp用户行。注意:这个文件的权限是000,所以要强制保存
[root@localhost ~]#vi /etc/group
lamp:x:501:
<-删除此行
#修改组信息文件,删除lamp组的行
[root@localhost ~]#vi /etc/gshadow
lamp:!::
<-删除此行
#修改组影子文件,删除lamp组的行。同样注意需要强制保存
[root@localhost ~]# rm -rf /var/spod/mail/lamp #删除用户邮箱
[root@localhost ~]# rm -rf/home/lamp/
#删除用户的家目录
#至此,用户彻底删除,再新建用户lamp。如果可以正常建立,则说明我们手工删除干净了
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立同名用户,没有报错,说明前面的手工删除是可以完全删除用户的

这个实验很有趣吧,不过命令比较多,大家通过这个实验应该可以清楚地了解到这几个用户相关文件的作用。

id 命令可以査询用户的UID、GID 和附加组的信息。命令比较简单,格式如下:

[root@localhost ~]# id 用户名


【例 1】

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


【例 2】

[root@localhost ~]# usermod -G root lamp
#把用户加入root组
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
#大家发现root组中加入了lamp用户的附加组信息

su 命令可以切换成不同的用户身份,命令格式如下:

[root@localhost ~]# su [选项] 用户名

选项:

  • -:选项只使用"-"代表连带用户的环境变量一起切换;
  • -c 命令:仅执行一次命令,而不切换用户身份


"-"不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。大家知道环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。

例如,普通用户 lamp 切换成超级用户 root,但是没有加入"-",那么虽然是 root 用户,但是 $PATH 环境变量还是 lamp 用户的,不包含 /sbin、/usr/sbin 等超级用户命令保存路径,所以无法使用管理员命令;而且 root 用户在接收邮件时,还会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL 没有切换过来。

【例 1】

[lamp@localhost ~]$ whoami
lamp
#查询用户身份,我是lamp
[lamp@localhost ~]$ su root
密码:
<-输入root密码
#切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码
[root@localhost ~]# env | grep lamp
#查看环境变量,提取包含lamp的行
USER=lamp
#用户名还是lamp,而不是root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lamp/bin
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/lamp
PWD=/home/lamp
LOGNAME=lamp
#邮箱、家目录、目前用户名还是lamp

通过该例我们已经注意到,切换用户时如果没有加入"-",那么切换是不完全的。要想完整切换,可以使用如下命令:

【例 2】

[lamp@localhost ~]$ su -root 密码:
#"-"代表连带环境变量一起切换,不能省略

有些系统命令只有 root 可以执行,比如添加用户的命令 useradd,所以我们需要使用 root 身份执行。但是我们只想执行一次,而不想切换身份,可以做到吗?当然可以,命令如下:

【例3】

[lamp@localhost ~]$ whoami
lamp
#当前我是lamp
[lamp@localhost ~]$ su -root -c "useradd user1"
密码:
#不切换成root,但是执行useradd命令添加user1用户
[lamp@localhost ~]$ whoami
lamp
#我还是lamp
[lamp@localhost ~]$ grep "user1' /etc/passwd userl:x:502:504::/home/user1 :/bin/bash #user用户已经添加了

总之,切换用户时 "-" 代表连带环境变量一起切换,不能省略,否则用户身份切换不完全。

添加用户组的命令是 groupadd,命令格式如下:

[root@localhost ~]# groupadd [选项] 组名

选项:

  • -g GID:指定组ID;


添加用户组的命令比较简单,举个例子:

[root@localhost ~]# groupadd group1
#添加group1组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:

groupmod 命令用于修改用户组的相关信息,命令格式如下:

[root@localhost ~]# groupmod [选现] 组名

选项:

  • -g GID:修改组 ID;
  • -n 新组名:修改组名;

例子:

[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意GID还是502,但是组名已经改变

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

groupdel 命令用于删除用户组,命令格式如下:

[root@localhost ~]#groupdel 组名

例子:

[root@localhost ~]#groupdel testgrp
#删除testgrp

不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。

其实 gpasswd 命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加进组或从组中删除。

gpasswd 命令格式如下:

[root@localhost ~]# gpasswd 选项 组名

选项:

  • -a 用户名:把用户加入组;
  • -d 用户名:把用户从组中删除;


举个例子:

[root@localhost ~]# groupadd grouptest
#添加组grouptest
[root@localhost ~]# gpasswd -a lamp grouptest
Adding user lamp to group grouptest
#把用户lamp加入grouptest组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
grouptest:x:505:lamp
#査看一下,lamp用户已经作为附加用户加入grouptest组
[root@localhost ~]# gpasswd -d lamp grouptest
Removing user lamp from group grouptest
#把用户lamp从组中删除
[root@localhost ~]# grep "grouptest" /etc/group grouptest:x:505:
#组中没有lamp用户了

大家注意,也可以使用 usermod 命令把用户加入某个组,不过 usermod 命令的操作对象是用户,命令是 "usermod -G grouptest lamp",把用户名作为参数放在最后;而 gpasswd 命令的操作对象是组,命令是"gpasswd -a lamp grouptest",把组名作为参数放在最后。

推荐大家使用 gpasswd 命令,因为这个命令不仅可以把用户加入用户组,也可以把用户从用户组中删除。

我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?

当然是初始用户组的组身份生效了,因为初始组是用户一旦登陆就获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令 newgrp 就可以切换用户的有效组。命令格式如下:

[root@localhost ~]# newgrp 组名

举个例子,我们已经有了普通用户 lamp,默认会建立 lamp 用户组,lamp 组是 lamp 用户的初始组。我们再把 lamp 用户加入 group1 组,那么 group1 组就是 lamp 用户的附加组。当 lamp 用户创建文件 test1 时,test1 文件的属组是 lamp 组,因为 lamp 组是 lamp 用户的有效组。通过 newgrp 命令就可以把 lamp 用户的有效组变成 group1 组,当 lamp 用户创建文件 test2 时,就会发现 test2 文件的属组就是 group1 组。命令如下:

[root@localhost ~]# groupadd group1
#添加组group1
[root@localhost ~]# gpasswd -a lamp group1
Adding user lamp to group group1 #把lamp用户加入group1组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
group1:x:503:lamp
#lamp用户既属于lamp组,也属于group1组
[root@localhost ~]# su - lamp
#切换成lamp身份,超级用户切换成普通用户不用密码
[lamp@localhost ~]$ touch test1
#创建文件test1
[lamp@localhost ~]$ll test1
-rw-rw-r-- 1 lamp lamp 01月14 05:43 test1
#test1文件的默认属组是lamp组
[lamp@localhost ~]$ newgrp group1
#切换lamp用户的有效组为group1组
[lamp@localhost ~]$ touch test2
#创建文件test2
[lamp@localhost ~]$ ll test2
-rw-r--r-- 1 lamp group1 01月 14 05:44 test2
#test文件的默认属组是group1组

通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用 newgrp 命令可以在多个组身份之间切换。

添加用户组的命令是 groupadd,命令格式如下:

[root@localhost ~]# groupadd [选项] 组名

选项:

  • -g GID:指定组 ID


添加用户组的命令比较简单,举个例子:

[root@localhost ~]# groupadd group1
#添加group1组
[root@localhost ~]# grep "group1" /etc/group
group1:x:502:

修改用户组:groupmod#

groupmod 命令用于修改用户组的相关信息,命令格式如下:

[root@localhost ~]# groupmod [选现] 组名

选项:

  • -g GID:修改组 ID;
  • -n 新组名:修改组名;


例子:

[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意GID还是502,但是组名已经改变

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

刪除用户组:groupdel#

groupdel 命令用于删除用户组,命令格式如下:

[root@localhost ~]#groupdel 组名
例子:
[root@localhost ~]#groupdel testgrp
#删除testgrp

不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。

把用户添加进组或从组中删除:gpasswd#

其实 gpasswd 命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被 sudo 命令取代,所以 gpasswd 命令现在主要用于把用户添加进组或从组中删除。

gpasswd 命令格式如下:

[root@localhost ~]# gpasswd 选项 组名

选项:

  • -a 用户名:把用户加入组;
  • -d 用户名:把用户从组中删除;


举个例子:

[root@localhost ~]# groupadd grouptest
#添加组grouptest
[root@localhost ~]# gpasswd -a lamp grouptest
Adding user lamp to group grouptest
#把用户lamp加入grouptest组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
grouptest:x:505:lamp
#査看一下,lamp用户已经作为附加用户加入grouptest组
[root@localhost ~]# gpasswd -d lamp grouptest
Removing user lamp from group grouptest
#把用户lamp从组中删除
[root@localhost ~]# grep "grouptest" /etc/group grouptest:x:505:
#组中没有lamp用户了

大家注意,也可以使用 usermod 命令把用户加入某个组,不过 usermod 命令的操作对象是用户,命令是 "usermod -G grouptest lamp",把用户名作为参数放在最后;而 gpasswd 命令的操作对象是组,命令是"gpasswd -a lamp grouptest",把组名作为参数放在最后。

推荐大家使用 gpasswd 命令,因为这个命令不仅可以把用户加入用户组,也可以把用户从用户组中删除。

改变有效组:newgrp#

我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?

当然是初始用户组的组身份生效了,因为初始组是用户一旦登陆就获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令 newgrp 就可以切换用户的有效组。命令格式如下:

[root@localhost ~]# newgrp 组名

举个例子,我们已经有了普通用户 lamp,默认会建立 lamp 用户组,lamp 组是 lamp 用户的初始组。我们再把 lamp 用户加入 group1 组,那么 group1 组就是 lamp 用户的附加组。当 lamp 用户创建文件 test1 时,test1 文件的属组是 lamp 组,因为 lamp 组是 lamp 用户的有效组。通过 newgrp 命令就可以把 lamp 用户的有效组变成 group1 组,当 lamp 用户创建文件 test2 时,就会发现 test2 文件的属组就是 group1 组。命令如下:

[root@localhost ~]# groupadd group1
#添加组group1
[root@localhost ~]# gpasswd -a lamp group1
Adding user lamp to group group1 #把lamp用户加入group1组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
group1:x:503:lamp
#lamp用户既属于lamp组,也属于group1组
[root@localhost ~]# su - lamp
#切换成lamp身份,超级用户切换成普通用户不用密码
[lamp@localhost ~]$ touch test1
#创建文件test1
[lamp@localhost ~]$ll test1
-rw-rw-r-- 1 lamp lamp 01月14 05:43 test1
#test1文件的默认属组是lamp组
[lamp@localhost ~]$ newgrp group1
#切换lamp用户的有效组为group1组
[lamp@localhost ~]$ touch test2
#创建文件test2
[lamp@localhost ~]$ ll test2
-rw-r--r-- 1 lamp group1 01月 14 05:44 test2
#test文件的默认属组是group1组

通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件时哪个组身份生效。使用 newgrp 命令可以在多个组身份之间切换。

posted @   鲸鱼的海老大  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
CONTENTS