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

CompTIACompTIABeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

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

你将首先使用 useradd 命令创建新用户及其主目录,然后使用 passwd 命令保护账户。接下来,你将探索 susu - 在切换用户时的区别,并学习如何锁定和解锁账户。你还将修改用户属性,例如使用 chage 修改密码过期策略,以及使用 usermod 修改组 membership。本实验最后将演示如何使用 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,已被自动创建为该用户的首要组。

现在用户已存在,你需要设置密码才能使账户可用并安全。我们将为此使用 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 (substitute user) 命令在当前终端会话中切换到另一个用户账户。你还将了解使用带或不带 - (或 --login) 标志的 su 命令之间的关键区别,这会显著影响用户环境。

首先,让我们检查一下你作为 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 环境变量仍然指向原始用户 (labex) 的家目录。
  • pwd: 你仍然在你切换用户之前的目录中 (/home/labex/project)。

这种行为可能存在问题,因为脚本和应用程序可能依赖 HOME 变量来查找配置文件,从而导致意外行为。

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

exit

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

su - student1

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

whoami
echo $HOME
pwd

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

student1
/home/student1
/home/student1

区别很显著:

  • whoami: 你仍然是 student1
  • echo $HOME: HOME 变量现在正确指向 /home/student1
  • pwd: 你的当前工作目录已更改为 student1 的家目录。

这表明 su - <username> 是在命令行中切换用户的推荐方式,因为它为新用户提供了一个干净、可预测的环境,避免了不正确的路径和权限问题。

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

exit

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

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

首先,让我们锁定 student1 账户。为此,你将使用 passwd 命令和 -l (lock) 选项。此操作需要管理员权限,因此你必须使用 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 (unlock) 选项来反转该过程。

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 修改用户密码有效期和组 membership

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

首先,让我们检查 student1 账户的密码有效期信息。chage (change age) 命令配合 -l (list) 标志可以显示这些详细信息。

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

接下来,让我们修改组 membership。用户属于一个主组,并且可以属于多个次要(或补充)组。你可以使用 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 将用户追加到组中,而不会将其从其他组中移除。

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 除了移除用户的账户条目外,还要移除其主目录和邮件 spool。这是一个完整且不可逆的删除。

sudo userdel -r student2

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

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

此警告并不表示错误——它仅仅意味着没有要删除的邮件 spool 文件,这对于一个新创建且未收到任何邮件的用户来说是符合预期的。

首先,验证账户条目是否已从 /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 修改用户的组 membership。最后,你探索了从系统中移除用户的过程,区分了 userdel 命令(移除用户账户)和 userdel -r 命令(同时删除用户的主目录和邮件 spool 以进行彻底清理)。