如何强制用户在 Linux 上下次登录时更改密码?

在深入技术细节之前,我们先来聊聊为什么要强制用户更改密码。想象一下:一个员工离职后,他的账户密码却没有及时更新;或者一个新用户拿到账户后,从未改过初始密码。这些情况都可能成为黑客入侵的突破口。Linux 作为一个多用户操作系统,广泛应用于服务器、云计算和企业环境,安全性尤为重要。强制用户在下次登录时更改密码,可以:

  • 防止密码长期不变:长时间使用同一密码会增加被猜测或破解的风险。
  • 应对初始密码问题:新账户的默认密码往往过于简单,强制更改能确保用户设置更安全的密码。
  • 提升安全意识:通过这种方式提醒用户关注密码管理的重要性。

Linux 系统提供了灵活的工具来实现这一目标,核心在于对密码策略的控制。接下来,我们将从基础知识入手,逐步揭开实现这一功能的神秘面纱。

Linux 中的密码管理

要理解如何强制用户更改密码,我们得先搞清楚 Linux 是如何管理密码的。Linux 的密码信息主要存储在一个叫做 /etc/shadow 的文件中。这个文件是系统安全的核心,只有 root 用户或具有特殊权限的用户才能访问。打开终端,输入 sudo cat /etc/shadow,你会看到类似这样的内容(当然,前提是你有权限):

每一行对应一个用户,包含了用户名和密码相关的信息,用冒号分隔成多个字段。让我们拆解一下这些字段的含义:

  1. 用户名:比如 newsuucp
  2. 密码哈希:以 $6$ 开头的一串字符,是加密后的密码。
  3. 最后更改日期 (lastchg):从 1970 年 1 月 1 日起的天数,表示密码最后一次更改的时间。
  4. 最小天数 (min):两次密码更改之间的最短间隔。
  5. 最大天数 (max):密码的有效期,过期后需要更改。
  6. 警告天数 (warn):密码过期前提前警告的天数。
  7. 失效天数 (inactive):密码过期后账户还能使用的天数。
  8. 账户过期日期 (expire):账户本身的过期时间。
  9. 保留字段:通常为空。

在这些字段中,最后更改日期 (lastchg) 是我们要关注的重点。如果我们把这个值设为 0,系统就会认为密码已经过期,用户下次登录时就会被要求更改密码。这就是强制更改密码的核心原理。

除了 /etc/shadow,Linux 还提供了一些命令行工具,比如 passwdchage,让我们可以轻松修改这些字段。我们主要会用到 chage,因为它专门用来管理密码的过期策略。接下来,我们进入正题,看看具体怎么操作。

如何强制用户更改密码

现在,我们要动手操作了。假设你是一个系统管理员,想让用户 alice 在下次登录时必须更改密码。以下是详细步骤:

步骤 1:获取权限

由于修改密码策略需要管理员权限,你需要以 root 用户身份操作,或者在命令前加上 sudo。在终端输入:

sudo -i  # 切换到 root 用户 

或者直接在每条命令前加 sudo,比如 sudo chage ...

步骤 2:使用chage命令

chage 是“change aging”的缩写,用来调整密码的过期时间。我们要做的,是将 alice 的最后更改日期设为 0。输入以下命令:

chage -d 0 alice 

步骤 3:验证设置

为了确保操作成功,我们可以用 chage -l 查看 alice 的密码策略:

chage -l alice 

输出会类似这样:

注意第一行,说明密码已经被标记为过期。

步骤 4:测试效果

alice 登录系统试试看。你可以用 su 命令模拟登录:

su - alice 

系统会提示类似以下信息:

此时,alice 必须输入当前密码,然后设置一个新密码。完成更改后,她才能正常使用系统。

注意事项

  • 如果 alice 已经登录,执行 chage -d 0 后不会立即生效。她需要退出当前会话并重新登录,新策略才会触发。
  • 如果提示“权限不足”,检查是否漏加了 sudo,或者是否以 root 身份操作。

通过这几个简单步骤,你就能强制单个用户在下次登录时更改密码。但如果你的系统有几十个甚至上百个用户,手动操作显然不现实。别担心,接下来我们会介绍如何批量处理。

批量管理密码策略

在一个大型系统中,管理员可能需要同时管理多个用户的密码策略。这时,手动输入命令就显得太低效了。我们可以用一个 shell 脚本来自动化这个过程。

编写批量脚本

假设你有一个用户列表文件 userlist.txt,里面每行是一个用户名,比如:

alice bob charlie 

我们可以写一个简单的脚本,循环读取这些用户名并应用密码策略。创建一个文件 force_password_change.sh

#!/bin/bash  # 检查是否以 root 身份运行 if [ "$EUID" -ne 0 ]; then     echo "请以 root 身份运行此脚本(使用 sudo)"     exit 1 fi  # 读取用户列表文件 USERLIST="userlist.txt"  if [ ! -f "$USERLIST" ]; then     echo "错误:用户列表文件 $USERLIST 不存在"     exit 1 fi  # 循环处理每个用户 while read -r user; do     if [ -n "$user" ]; then         chage -d 0 "$user"         echo "已设置 $user 下次登录时更改密码"     fi done < "$USERLIST"  echo "操作完成!" 

运行脚本

保存文件后,给它添加执行权限:

chmod +x force_password_change.sh 

然后运行:

sudo ./force_password_change.sh 

输出会类似这样:

已设置 alice 下次登录时更改密码 已设置 bob 下次登录时更改密码 已设置 charlie 下次登录时更改密码 操作完成! 

脚本说明

  • #!/bin/bash:指定脚本使用 bash 解释器。
  • 权限检查:确保脚本以 root 身份运行。
  • 文件检查:确认 userlist.txt 存在。
  • 循环读取:用 while read 逐行读取用户名并执行 chage -d 0

这个脚本简单实用,但功能可以进一步扩展。比如,你可以添加日志记录,或检查用户是否存在(用 id 命令)。如果需要更复杂的策略,比如设置密码定期过期,可以用 chage -M(见后文)。

常见问题与解决方法

在实际操作中,你可能会遇到一些小麻烦。别慌,这里整理了一些常见问题和解决方案:

问题 1:用户登录时没有提示更改密码

可能原因:用户当前已有活跃会话,执行 chage -d 0 后没有重新登录。 解决方法:让用户注销并重新登录,或者用 pkill -u 强制结束用户会话(小心使用,避免中断重要任务)。

问题 2:提示“权限不足”

可能原因:没有使用 root 权限。 解决方法:在命令前加 sudo,或用 sudo -i 切换到 root 用户。

问题 3:如何取消强制更改设置?

解决方法:可以用 chage -d 设置一个较新的日期,比如当前日期:

chage -d $(date +%Y-%m-%d) alice 

这会将 alice 的最后更改日期设为今天,取消过期状态。

问题 4:如何让密码定期过期?

解决方法:用 chage -M 设置最大有效期。比如,让密码每 90 天过期:

chage -M 90 alice 

结合 -d 0,你可以同时强制下次更改并设定未来的过期策略:

chage -d 0 -M 90 alice 
原文链接:,转发请注明来源!