注:本文为 “Linux 系统用户账号管理” 相关合辑。
略作重排,如有内容异常,请看原文。


一、密码修改前提

1.1 账户权限分级

Linux 系统通过权限分级管控密码修改操作,相关权限规则如下:

  • 普通用户:仅能修改自身账户密码,无法操作其他用户密码
  • root 用户(系统管理员):具备最高权限,可修改任意用户密码,还能执行密码锁定、解锁、清除、有效期配置等精细化管理操作

1.2 密码存储机制

用户密码的加密数据存储于 /etc/shadow 文件,该文件仅 root 用户可读可写(默认权限为 000 或 600),格式为:

用户名:加密密码:最后修改时间:最小间隔:最大有效期:警告天数:失效宽限:过期时间:保留字段

其中“加密密码”字段采用哈希算法加密(默认 SHA-512),无法直接读取,这是保障密码安全的重要机制。

1.3 常见修改场景

  • 初始密码优化:购买云服务器后,系统分配的默认密码复杂度过高,需修改为易记忆且安全的密码
  • 权限回收:用户账户分享后需收回控制权,或新建用户后需调整初始密码
  • 安全运维:定期更新密码以降低泄露风险,或疑似密码泄露时紧急重置
  • 测试与学习:在实验环境中演练密码修改操作,熟悉系统权限管控逻辑

二、实现方法:命令行操作

2.1 交互式修改:passwd 命令(最常用)

passwd 命令是 Linux 系统原生的密码管理工具,采用交互式操作模式,密码输入过程无字符回显,安全性较高,支持单用户密码修改与精细化账户管理。

2.1.1 登录与切换 root 用户操作

进入 root 用户会话环境是修改其密码的前提,可通过直接登录或账户切换两种方式实现:

  • 直接登录 root 用户:在系统登录界面输入 root 用户名与对应密码,完成身份验证后即可进入 root 用户会话。
  • 从非 root 用户切换至 root 用户:若当前登录账户为非 root 用户,需通过 su 命令实现账户切换。

2.1.2 su 命令使用与密码输入规则

  • su 命令使用细节:
    • 非 root 用户切换至 root 用户:直接执行 su 命令后按下回车键即可。
    • root 用户切换至非 root 用户:需执行 su username 指令(username 为目标非 root 用户名),指令与参数之间用空格分隔即可,空格数量不影响执行效果。
  • 密码输入规则:
    • 非 root 用户切换至 root 用户需输入 root 密码;root 用户切换至非 root 用户通常无需输入目标用户密码。
    • 输入密码过程中,终端界面无任何字符回显(与 Windows 系统显示 * 掩码不同),但输入内容会被系统正常接收。
    • 密码输入完成后按下回车键,系统验证正确则切换成功,错误则提示重新输入。

2.1.3 权限与操作规则

  • 普通用户:仅能修改自身密码,执行命令后需输入当前密码验证,再输入两次新密码确认
  • root 用户:可修改任意用户密码,无需验证目标用户当前密码,还可执行锁定、解锁、清除密码等操作

2.1.4 操作示例与参数说明

passwd 命令的常用参数信息如下(仅供参考):

常用操作示例:

# 1. 普通用户修改自身密码
passwd

# 2. root 用户修改指定用户(如 www)密码
passwd www

# 3. 锁定用户(禁止密码登录)
passwd -l www

# 4. 解锁用户
passwd -u www

# 5. 清除用户密码(允许无密码登录)
passwd -d www

# 6. 查看用户密码状态
passwd -S www

2.1.5 root 用户密码修改实操流程

root 用户通过 passwd 命令修改自身密码的具体操作流程如下:

  1. 在 root 用户的终端会话中直接输入 passwd 命令,按下回车键执行。
  2. 终端提示 New password 时,输入拟配置的新密码。
  3. 终端提示 Retype new password 时,再次输入相同的新密码进行确认。
  4. 两次输入的密码内容一致时,系统将提示密码更改成功;若两次输入内容不一致,则需重新执行上述步骤。

2.2 非交互式修改:chpasswd 命令(批量场景)

chpasswd 命令适用于非交互式环境,通过管道或文件传入“用户名:密码”的明文格式数据,支持批量修改多用户密码,仅 root 用户可执行。

2.2.1 操作要点

  • 密码传递:需通过 echo "用户名:密码" | chpasswd 或读取文件(cat user_list.txt | chpasswd)传入数据,文件中每行格式为“用户名:密码”
  • 安全性注意:密码以明文形式出现在命令行或文件中,需及时删除对应历史命令(history -d 行号)与密码文件,避免泄露

2.2.2 操作示例

# 1. 单个用户密码修改
echo "www:123456@Linux" | chpasswd

# 2. 批量修改多用户密码(需提前创建 user_list.txt 文件)
# user_list.txt 内容示例:
# user1:pass123
# user2:pass456
cat user_list.txt | chpasswd

# 3. 检索 chpasswd 相关历史命令
history | grep chpasswd

# 4. 删除指定行号的历史命令(假设行号为 100)
history -d 100

三、其他实现方式

3.1 系统文件直接修改:/etc/shadow 编辑

直接修改存储密码加密数据的 /etc/shadow 文件,需手动生成密码加密串,适用于系统救援模式(无 passwd 工具)或脚本自动化场景,仅 root 用户可操作。

3.1.1 操作步骤

# 1. 生成密码加密串(采用 SHA-512 算法)
openssl passwd -6 "新密码"
# 输出示例:$6$rounds=65536$salt$encrypted_password

# 2. 编辑 /etc/shadow 文件
vim /etc/shadow

# 3. 替换目标用户对应的加密密码字段
# 找到目标用户行(如 www:原加密串:...),将“原加密串”替换为步骤 1 生成的新加密串

# 4. 保存文件并退出,确保文件权限为 000 或 600(仅 root 可读可写)
chmod 600 /etc/shadow

3.2 usermod 命令修改

usermod 是 Linux 系统用户信息管理工具,可通过 -p 参数直接设置用户密码(需传入加密串),仅 root 用户可执行,适用于脚本自动化配置场景。

3.2.1 操作示例

# 1. 生成密码加密串
encrypted_pass=$(openssl passwd -6 "123456@Linux")

# 2. 使用 usermod 设置 www 用户密码
usermod -p "$encrypted_pass" www

说明:-p 参数后必须传入加密后的密码串,不可直接传入明文,否则会导致密码验证失败。补充:若需同步修改用户家目录、登录shell等信息,可搭配 usermod 其他参数(如 -d 指定家目录、-s 指定登录shell),示例:usermod -p "$encrypted_pass" -d /home/new_www -s /bin/bash www

3.3 图形界面工具(桌面环境)

Linux 桌面发行版(如 Ubuntu、CentOS GNOME、KDE 等)提供可视化用户管理工具,操作简单直观,适合非命令行用户。

3.3.1 常见操作路径

  • GNOME 系统:设置 → 用户 → 选择目标用户 → 点击“密码”选项 → 输入新密码并确认
  • Ubuntu 系统:可通过命令 gnome-control-center user-accounts 直接启动用户管理界面
  • KDE 系统:系统设置 → 用户和组 → 选择用户 → 编辑密码

3.3.2 权限规则

  • 普通用户:仅可修改自身密码,需验证当前密码
  • 管理员:需输入管理员密码授权,可修改任意用户密码

3.4 非 root 用户密码修改的两种方式

非 root 用户的密码更改存在两种操作方式,分别为通过 root 用户执行修改操作与通过非 root 用户自行修改操作,具体如下:

3.4.1 方式一:通过 root 用户更改非 root 用户密码

在 root 用户的终端会话中,执行 passwd username 指令即可修改目标非 root 用户的密码,其中 username 为目标用户的账户名称。

操作流程为输入指令后,依次输入新密码与确认密码,两次输入内容一致即可完成密码修改。

注意事项:通过 root 用户修改非 root 用户密码时,无需输入目标非 root 用户的原有密码,体现 root 用户对系统账户的最高管理权限。

3.4.2 方式二:通过非 root 用户自行更改密码

非 root 用户仅能修改自身账户的密码,操作前提为登录至该非 root 用户的终端会话。

说明:非 root 用户无法修改其他非 root 用户的密码,该权限限制是保障系统账户安全的重要机制。若普通用户之间可互相修改密码,将导致系统账户的安全性无法得到保障。root 用户虽具备修改所有用户密码的权限,但该权限应仅限系统管理员使用,且需严格保管 root 用户密码,避免泄露。

3.5 自动化交互:expect 脚本

expect 工具可模拟 passwd 命令的交互式过程,自动完成密码输入与确认,适用于批量修改密码且需避免明文暴露的场景,需提前安装 expect 包。

3.5.1 示例脚本(批量修改用户密码)

#!/usr/bin/expect
# 脚本用法:expect passwd_auto.exp 用户名 新密码
set username [lindex $argv 0]
set password [lindex $argv 1]

# 启动 passwd 命令
spawn passwd $username

# 模拟交互过程
expect "New password:"
send "$password\r"
expect "Retype new password:"
send "$password\r"

# 等待命令执行完成并输出结果
expect eof
# 补充:添加日志记录功能(可选)
# set log [open "passwd_modify.log" a]
# puts $log "[exec date] - 用户名 $username 密码修改完成"
# close $log

3.5.2 执行方式

# 1. 安装 expect 工具(CentOS)
yum install -y expect

# 2. 赋予脚本执行权限
chmod +x passwd_auto.exp

# 3. 执行脚本修改 www 用户密码
expect passwd_auto.exp www 123456@Linux

四、密码有效期管理:chage 命令

chage 命令用于精细化管理用户密码的生命周期,可设置密码有效期、过期预警、账户失效宽限等参数,仅 root 用户可执行,常与 passwd 命令配合使用。

4.1 常用参数说明

  • -l, --list:查看目标用户的密码有效期配置
  • -M, --maxdays 天数:设置密码最长有效天数
  • -m, --mindays 天数:设置两次密码修改的最小间隔天数
  • -W, --warndays 天数:设置密码过期前的预警天数
  • -E, --expiredate 日期:设置账户过期时间(超期无法登录)
  • -d, --lastday 日期:设置最近一次密码修改时间

4.2 操作示例

# 1. 查看 www 用户密码有效期配置
chage -l www

# 2. 设置 www 用户密码 90 天后过期
chage -M 90 www

# 3. 设置密码过期前 7 天提醒用户
chage -W 7 www

# 4. 设置账户 2024-12-31 过期
chage -E 2024-12-31 www

五、方法对比

5.1 实操对比

对比项 passwd 命令 chpasswd 命令 /etc/shadow 直接编辑 usermod 命令 图形界面工具 expect 脚本
操作模式 交互式,需手动确认密码 非交互式,管道/文件传参 手动编辑文件,需生成加密串 非交互式,参数传入加密串 可视化交互,点击操作确认 自动化交互,脚本模拟输入
权限要求 普通用户:仅改自身;root:改任意+精细化操作 仅 root 用户可执行 仅 root 用户可执行(文件权限严格) 仅 root 用户可执行 普通用户:仅改自身;
管理员:改任意
普通用户:仅改自身;
root:改任意
安全性 高:无明文回显,密码不存入历史记录 中:明文传参,需手动清理历史命令与密码文件 高:加密串写入,文件仅 root 可访问 中:需妥善处理加密串,避免脚本泄露 高:交互无明文,依赖系统权限管控 高:模拟交互无明文,脚本需加密存储
操作效率(单用户) 高:3 步完成(输命令→输新密码→确认) 高:1 条命令直接完成,需提前准备明文 低:需生成加密串+编辑文件+验证权限 中:需生成加密串+执行命令,2 步完成 中:导航界面+输入确认,点击操作较多 中:需提前编写脚本,执行仅 1 步
批量处理能力 弱:需逐用户交互操作,无法直接批量 强:支持文件批量导入,秒级处理多用户 弱:需逐用户替换加密串,易出错 中:需结合循环脚本实现批量,需编写逻辑 弱:需逐用户进入编辑界面,操作繁琐 强:结合循环脚本可批量处理,支持日志记录
密码策略适配性 强:自动适配系统密码策略(复杂度、长度),不符合则提示 中:需提前确保密码符合策略,否则修改失败无详细提示 弱:直接写入加密串,不校验策略,易设置弱密码 中:需提前确保加密串对应密码符合策略,无校验机制 强:界面实时校验策略,不符合则无法提交 中:需在脚本中添加策略校验逻辑,否则可能失败
适用场景 日常单用户修改、需精细化管理(锁定/过期)场景 批量初始化用户密码、脚本自动化快速更新场景 系统救援(无 passwd 工具)、特殊密码重置场景 脚本自动化部署中,需同步修改用户其他信息的场景 桌面环境用户、非命令行操作习惯的场景 批量交互修改、需保留操作日志、追求自动化安全性的场景
操作复杂度 低:无需记忆复杂参数,新手易上手 低:仅需掌握传参格式,命令简单 中:需掌握 openssl 加密与文件编辑,易出错 中:需掌握加密串生成与参数使用,新手需学习 低:可视化操作,无需记忆命令 中:需掌握 expect 语法,编写脚本有一定门槛

补充说明:对比表中未提及的细节:1. chpasswd 命令支持从标准输入批量读取用户密码信息,也可直接指定文件(chpasswd < user_list.txt),与 cat user_list.txt | chpasswd 效果一致;2. expect 脚本可通过添加异常捕获逻辑(如密码不符合策略时的重试机制)提升稳定性。

5.2 实操建议

  • 日常单用户修改:优先选 passwd 命令,兼顾安全性与便捷性,新手也能快速上手。
  • 批量初始化/更新多用户密码:优先选 chpasswd 命令(需提前清理历史);若对安全性要求高,可选用 expect 脚本(支持策略校验与日志记录)。
  • 桌面环境非命令行用户:直接使用图形界面工具,可视化操作无需记忆命令,策略校验更直观。
  • 系统救援/无 passwd 工具场景:选择直接编辑 /etc/shadow 文件,注意提前生成符合策略的加密串,修改后校验文件权限。
  • 脚本自动化部署(需同步修改用户信息):选择 usermod 命令,可在修改密码的同时,同步配置用户家目录、登录shell等信息,提升部署效率。
  • 企业级批量运维(需追溯操作):优先选 expect 脚本,可添加操作日志打印、失败重试、策略校验等逻辑,满足运维合规要求。

六、安全操作规范与常见问题排查

6.1 安全操作规范

  • 密码复杂度要求:设置长度≥8 位、包含大小写字母、数字与特殊符号的强密码,避免使用生日、手机号等易泄露信息
  • 历史命令清理:使用 chpasswd 命令后,必须执行history | grep chpasswd 检索并删除对应历史命令
  • 文件权限管控:/etc/shadow 文件默认权限为 000 或 600,修改后需确保权限未被放宽,防止非授权访问
  • 权限最小化:避免随意将 root 密码告知他人,普通用户仅授予必要权限,不随意提升权限
  • 定期更新密码:建议每 90 天更新一次系统账户密码,降低泄露风险

6.2 常见问题排查

6.2.1 密码修改后无法登录

  • 原因 1:两次输入密码不一致,未正确修改成功 → 重新执行 passwd 命令,确保两次输入一致
  • 原因 2:使用 usermod 时直接传入明文密码 → 需重新生成加密串,使用加密串执行修改
  • 原因 3:/etc/shadow 文件权限错误 → 执行chmod 600 /etc/shadow 修正权限

6.2.2 执行命令提示权限不足

  • 原因:普通用户尝试修改其他用户密码,或执行锁定、解锁等需 root 权限的操作 → 切换至 root 用户(su 命令)或使用 sudo 授权执行

6.2.3 chpasswd 命令执行后密码未生效

  • 原因 1:传入的“用户名:密码”格式错误(如多空格、用户名不存在)→ 检查格式与用户名有效性
  • 原因 2:密码不符合系统密码策略(如复杂度不足)→ 调整密码复杂度后重新执行

6.2.4 密码过期后无法登录

  • 解决方案:root 用户执行 passwd 用户名 重新设置密码,或执行 chage -E -1 用户名 取消账户过期限制。补充:若需查看账户过期时间,可执行 chage -l 用户名 检索相关配置。


ref:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐