介绍
在本实验中,你将学习在 Linux 系统上管理用户账户的核心技能。你将练习用户管理的完整生命周期,从创建和保护新账户,到修改其属性,最后安全地删除它们。对于任何负责维护多用户 Linux 环境的系统管理员来说,这种实战经验都是至关重要的。
你将首先使用 useradd 命令创建一个新用户及其家目录,然后使用 passwd 保护该账户。接着,你将探索 su 和 su - 在切换用户时的区别,并学习如何锁定和解锁账户。你还将修改用户属性,例如使用 chage 设置密码过期策略,以及使用 usermod 管理组数关系。实验最后将演示如何使用 userdel 命令正确移除用户及其相关数据。
使用 useradd 和 passwd 创建并保护用户
在这一步中,你将学习如何使用 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:::
注意,第二字段现在包含一串长而复杂的字符串。这是你刚才设置的密码的哈希(加密)版本。该账户现在已激活,可以用于登录。
使用 su 与 su - 切换用户并理解环境差异
在这一步中,你将探索如何使用 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 $HOME:HOME环境变量现在指向了新用户(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 $HOME:HOME变量指向/home/student1(与su相同)。pwd:你的当前工作目录已更改为student1的家目录。
这表明 su - <用户名> 是在命令行切换用户的推荐方式,因为它为新用户提供了一个干净、可预测的环境,防止了路径和权限错误的问题。
要完成此步骤,输入 exit 返回到原始的 labex 会话。
exit
使用 passwd -l 和 passwd -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
使用 chage 和 usermod 修改用户密码过期策略和组数关系
在这一步中,你将管理更高级的用户属性。你将学习如何使用 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
现在,使用 usermod 将 student1 添加到这个新组中。-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,并仅使用 -G 将 student1 添加到其中。
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)
使用 userdel 和 userdel -r 删除用户及其数据
在这一步中,你将学习如何使用 userdel 命令从系统中永久移除用户账户。你将看到仅删除用户账户信息与删除账户及其所有关联文件(如家目录)之间的重要区别。
首先,为了演示这两种删除方法,让我们创建第二个名为 student2 的用户。
sudo useradd -m student2
现在你有两个用户可以操作:student1(来自之前的步骤)和新创建的 student2。
让我们先尝试在不带任何特殊选项的情况下删除 student1 用户。默认的 userdel 命令会从 /etc/passwd 和 /etc/shadow 等系统账户文件中移除用户的条目,但它不会移除其家目录。如果你需要在完全移除用户数据之前对其进行存档,这会非常有用。
sudo userdel student1
要确认用户账户已消失,请尝试在 /etc/passwd 中 grep 搜索它。
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 设置密码来保护账户。你练习了使用 su 和 su - 在用户之间切换,了解了标准 Shell 环境与登录 Shell 环境之间的关键区别。你还学习了如何通过 passwd 命令的 -l 和 -u 选项锁定和解锁账户访问权限。
实验继续进行了现有用户属性的修改。你使用了 chage 来管理密码过期策略,并使用 usermod 更改了用户的组数关系。最后,你探索了从系统中移除用户的过程,区分了仅移除用户账户的 userdel 命令,以及同时删除用户家目录和邮件池以进行彻底清理的 userdel -r 命令。



