使用 useradd、usermod 和 userdel 管理 Linux 用户账户

CompTIABeginner
立即练习

介绍

在本实验中,你将学习在 Linux 系统上管理用户账户的核心技能。你将练习用户管理的完整生命周期,从创建和保护新账户,到修改其属性,最后安全地删除它们。对于任何负责维护多用户 Linux 环境的系统管理员来说,这种实战经验都是至关重要的。

你将首先使用 useradd 命令创建一个新用户及其家目录,然后使用 passwd 保护该账户。接着,你将探索 susu - 在切换用户时的区别,并学习如何锁定和解锁账户。你还将修改用户属性,例如使用 chage 设置密码过期策略,以及使用 usermod 管理组数关系。实验最后将演示如何使用 userdel 命令正确移除用户及其相关数据。

使用 useraddpasswd 创建并保护用户

在这一步中,你将学习如何使用 useradd 命令创建一个新的用户账户,然后通过 passwd 命令设置密码来确保其安全性。这些是管理 Linux 系统的基础管理任务。

首先,让我们创建一个名为 student1 的新用户。useradd 命令需要 root 权限才能创建用户,因此你需要在命令前加上 sudo

在终端中执行以下命令:

sudo useradd -m student1

-m 选项非常重要;它告诉 useradd 创建用户的家目录,默认情况下为 /home/student1。如果不使用 -m,用户虽然会被创建,但他们将没有用于存储文件的个人家目录。

运行命令后,系统会在几个关键的系统文件中为新用户创建条目。你可以使用 grep 命令在 /etc/passwd/etc/shadow/etc/group 文件中搜索以 student1 开头的行来验证这一点。由于读取 /etc/shadow 需要 root 权限,因此你需要使用 sudo

sudo grep ^student1 /etc/passwd /etc/shadow /etc/group

你的输出应该类似于下面这样。用户 ID(UID)和组 ID(GID)的数字可能会有所不同,但结构是一样的:

/etc/passwd:student1:x:5001:5001::/home/student1:/bin/sh
/etc/shadow:student1:!:20265:0:99999:7:::
/etc/group:student1:x:5001:

让我们分析一下这些输出:

  • /etc/passwd:此文件包含基本的用户账户信息。第二字段中的 x 表示加密后的密码不存储在这里,而是为了安全起见存储在 /etc/shadow 文件中。
  • /etc/shadow:此文件包含安全的用户账户信息。第二字段最初会包含 !*,表示尚未设置密码,该账户无法用于登录。
  • /etc/group:系统自动创建了一个同样名为 student1 的新组,作为该用户的初始组(Primary Group)。

现在用户已经存在,你需要设置一个密码使账户可用且安全。我们将为此使用 passwd 命令。与 useradd 一样,在更改其他用户的密码时需要使用 sudo

sudo passwd student1

系统会提示你输入并再次输入 student1 的新密码。在本实验中,请使用 student1pass 作为密码。请注意,出于安全原因,你输入的内容不会显示在屏幕上。

New password:
Retype new password:
passwd: password updated successfully

设置好密码后,让我们再次检查 /etc/shadow 文件看看发生了什么变化。由于 /etc/shadow 需要 root 权限才能读取,你需要使用 sudo

sudo grep ^student1 /etc/shadow

现在的输出会有所不同。占位符 ... 代表一串长且唯一的字符。

student1:$y$j9T$lUM1RtLPQdrCOHmaFf1po/$xqNw.5dz54yR9whxsID9teI28/BOyvKocK5dA9X7GoD:20265:0:99999:7:::

注意,第二字段现在包含一串长而复杂的字符串。这是你刚才设置的密码的哈希(加密)版本。该账户现在已激活,可以用于登录。

使用 susu - 切换用户并理解环境差异

在这一步中,你将探索如何使用 su(替代用户)命令在当前终端会话中切换到另一个用户账户。你还将学习使用 su 时带与不带 -(或 --login)标志的关键区别,这会显著影响用户环境。

首先,让我们检查一下作为 labex 用户时的当前环境。运行这些命令查看当前用户、家目录和工作目录:

whoami
echo $HOME
pwd

你将看到以下输出,确认你是项目目录中的 labex 用户:

labex
/home/labex
/home/labex/project

现在,让我们切换到你在上一步中创建的 student1 用户。使用 su 命令后跟用户名。系统会提示你输入 student1 的密码,即 student1pass

su student1

输入密码后,你的会话现在以 student1 的身份运行。然而,环境并没有完全加载。让我们再次运行相同的命令,看看哪些改变了,哪些没有。

whoami
echo $HOME
pwd

注意输出:

student1
/home/student1
/home/labex/project

这告诉我们:

  • whoami:你现在实际上是 student1
  • echo $HOMEHOME 环境变量现在指向了新用户(student1)的家目录。
  • pwd:你仍然处于切换用户之前的目录中(/home/labex/project)。

这种行为可能会产生问题,因为脚本和应用程序可能会依赖 HOME 变量来查找配置文件,从而导致不可预知的行为。

现在,输入 exit 返回到你的 labex 用户 Shell。

exit

接下来,让我们再次尝试切换用户,但这次带上 - 标志。这个标志告诉 su 启动一个登录 Shell(Login Shell),这会模拟新用户的完整登录过程。这意味着它将加载 student1 的完整环境,包括其家目录和 Shell 配置文件。

su - student1

再次输入密码(student1pass)。现在,运行同一组诊断命令:

whoami
echo $HOME
pwd

将输出与之前的尝试进行比较:

student1
/home/student1
/home/student1

差异非常显著:

  • whoami:你仍然是 student1
  • echo $HOMEHOME 变量指向 /home/student1(与 su 相同)。
  • pwd:你的当前工作目录已更改为 student1 的家目录。

这表明 su - <用户名> 是在命令行切换用户的推荐方式,因为它为新用户提供了一个干净、可预测的环境,防止了路径和权限错误的问题。

要完成此步骤,输入 exit 返回到原始的 labex 会话。

exit

使用 passwd -lpasswd -u 锁定与解锁用户账户

在这一步中,你将学习如何通过锁定账户来临时禁用它,然后通过解锁来重新启用它。这是一种常见的管理实践,适用于需要阻止用户登录但又不想删除其账户和文件的情况。

首先,让我们锁定 student1 账户。为此,你需要使用带有 -l(锁定)选项的 passwd 命令。此操作需要管理权限,因此必须使用 sudo

sudo passwd -l student1

命令将确认密码已被锁定。输出消息可能会略有不同,但都表示成功。

passwd: password for user student1 changed.

但是“锁定”实际上做了什么呢?让我们再次检查 /etc/shadow 文件以查看效果。

sudo grep ^student1 /etc/shadow

你会注意到一个细微但重要的变化。加密后的密码字符串现在以一个或两个感叹号(!)开头。占位符 ... 代表你唯一的哈希值的其余部分。

student1:!$y$j9T$...:20265:0:99999:7:::

这个 ! 前缀使存储的密码哈希失效,导致系统无法匹配用户提供的任何密码。结果就是用户无法登录。让我们测试一下。尝试切换到 student1 用户:

su - student1

系统会提示你输入密码,但即使你输入了正确的密码(student1pass),登录也会失败。

Password:
su: Authentication failure

这确认了账户已成功锁定。现在,让我们解锁它。要重新启用账户,只需使用 passwd 命令的 -u(解锁)选项反向操作即可。

sudo passwd -u student1

同样,命令会确认更改。

passwd: password for user student1 changed.

让我们最后一次检查 /etc/shadow 文件,验证账户是否已解锁。

sudo grep ^student1 /etc/shadow

输出显示 ! 前缀已被移除,恢复了原始的密码哈希。

student1:$y$j9T$...:20265:0:99999:7:::

账户现在再次处于激活状态。你可以通过成功切换到 student1 用户来确认这一点。提示时输入密码 student1pass

su - student1

你现在应该已经以 student1 身份登录。最后,输入 exit 返回到你的 labex 会话。

exit

使用 chageusermod 修改用户密码过期策略和组数关系

在这一步中,你将管理更高级的用户属性。你将学习如何使用 chage 强制执行密码安全策略以控制密码过期,以及如何使用 usermod 管理用户的组数关系以控制其权限和访问权。

首先,让我们检查 student1 账户的密码过期信息。带有 -l(列表)标志的 chage(更改期限)命令可以显示这些详细信息。

sudo chage -l student1

输出将显示账户的默认设置。日期将对应于你创建用户的日期。

Last password change     : Dec 08, 2024
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

出于安全考虑,要求用户定期更改密码是一个好习惯。让我们设置一个策略:密码必须每 90 天更改一次(-M 90),两次更改之间至少间隔 7 天(-m 7),并且用户在密码过期前 14 天会收到警告(-W 14)。

sudo chage -M 90 -m 7 -W 14 student1

现在,再次查看设置以确认更改:

sudo chage -l student1

输出将反映新的策略:

Last password change     : Dec 08, 2024
Password expires     : Mar 08, 2025
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 7
Maximum number of days between password change  : 90
Number of days of warning before password expires : 14

接下来,让我们修改组数关系。一个用户属于一个初始组(Primary Group),并且可以属于多个附加组(Secondary Groups)。你可以使用 id 命令查看用户的组信息。

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1)

这显示 student1 的初始组是 student1(gid=5001),且尚未加入任何附加组。

让我们创建一个名为 developers 的新组,并将 student1 添加到其中。首先,创建该组:

sudo groupadd developers

现在,使用 usermodstudent1 添加到这个新组中。-aG 标志至关重要:-G 指定附加组,而 -a(append)将用户追加到组中,而不会将其从其他组中移除。

sudo usermod -aG developers student1

再次检查用户的组信息:

id student1

输出现在包含了 developers 组:

uid=5001(student1) gid=5001(student1) groups=5001(student1),1002(developers)

如果你忘记了 -a 标志会发生什么?让我们创建另一个组 testers,并仅使用 -Gstudent1 添加到其中。

sudo groupadd testers
sudo usermod -G testers student1

现在最后检查一次组信息:

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers)

注意,student1 不再属于 developers 组了。使用 usermod -G 而不带 -a替换所有现有的附加组为新的列表。要让用户同时属于两个组,你必须列出所有组(-G developers,testers)或使用追加标志。让我们通过正确地将 student1 重新添加到 developers 组来修复这个问题。

sudo usermod -aG developers student1

验证最终状态。该用户现在应该是这两个组的成员。

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers),1002(developers)

使用 userdeluserdel -r 删除用户及其数据

在这一步中,你将学习如何使用 userdel 命令从系统中永久移除用户账户。你将看到仅删除用户账户信息与删除账户及其所有关联文件(如家目录)之间的重要区别。

首先,为了演示这两种删除方法,让我们创建第二个名为 student2 的用户。

sudo useradd -m student2

现在你有两个用户可以操作:student1(来自之前的步骤)和新创建的 student2

让我们先尝试在不带任何特殊选项的情况下删除 student1 用户。默认的 userdel 命令会从 /etc/passwd/etc/shadow 等系统账户文件中移除用户的条目,但它不会移除其家目录。如果你需要在完全移除用户数据之前对其进行存档,这会非常有用。

sudo userdel student1

要确认用户账户已消失,请尝试在 /etc/passwdgrep 搜索它。

grep ^student1 /etc/passwd

此命令不会产生任何输出,这确认了用户的账户条目已被删除。然而,家目录呢?让我们检查 /home/student1 是否仍然存在。

ls -ld /home/student1

你会看到该目录仍然存在,尽管所有者现在显示为一个数字(用户的旧 UID),因为系统已经无法再将该 ID 映射到用户名。

drwxr-x--- 2 5001 5001 78 Jun 26 08:18 /home/student1

现在,让我们删除 student2 用户,但这次我们将使用 -r(remove)标志。此选项告诉 userdel 除了删除账户条目外,还要删除用户的家目录和邮件池(Mail Spool)。这是一个彻底且不可逆的删除操作。

sudo userdel -r student2

你可能会看到一条关于找不到邮件池的警告消息,这是正常的,因为该用户从未收到过任何邮件:

userdel: student2 mail spool (/var/mail/student2) not found

此警告并不表示错误——它只是意味着没有邮件池文件可供删除,这对于从未收到过邮件的新创建用户来说是预料之中的。

首先,验证账户条目是否已从 /etc/passwd 中消失。与之前一样,此命令不应返回任何输出。

grep ^student2 /etc/passwd

接着,也是最重要的,检查家目录 /home/student2 是否存在。

ls -ld /home/student2

这一次,命令将失败并显示错误消息,证明该目录已随用户账户一起被完全移除。

ls: cannot access '/home/student2': No such file or directory

你现在已经成功练习了两种删除用户的方法,这使你能够根据需要灵活地保留或永久擦除用户数据。

总结

在本实验中,你学习了在 Linux 系统上管理用户账户的基础命令。你首先使用 useradd -m 创建了一个新用户,确保同时创建了家目录,然后通过 passwd 设置密码来保护账户。你练习了使用 susu - 在用户之间切换,了解了标准 Shell 环境与登录 Shell 环境之间的关键区别。你还学习了如何通过 passwd 命令的 -l-u 选项锁定和解锁账户访问权限。

实验继续进行了现有用户属性的修改。你使用了 chage 来管理密码过期策略,并使用 usermod 更改了用户的组数关系。最后,你探索了从系统中移除用户的过程,区分了仅移除用户账户的 userdel 命令,以及同时删除用户家目录和邮件池以进行彻底清理的 userdel -r 命令。