在Linux系统管理当中,给用户设置登录口令最常用且标准的命令就是passwd。无论是刚用useradd创建的新账户,还是系统中已存在但需要定期更换口令的老账户,都可以通过这个命令完成密码的写入与更新。passwd背后操作的是/etc/shadow文件,把用户输入的明文经过crypt算法加密后存为哈希串,供后续登录认证使用。

一、passwd命令的基本用法
最基础的场景是管理员为指定用户添加密码。在终端中以root身份执行以下命令,系统会提示连续输入两次新密码,两次一致后才生效:
# 为名为devuser的用户设置密码 passwd devuser # 执行后终端交互示例: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
如果不带任何参数直接输入passwd,则是修改当前登录用户自己的密码。普通用户修改自身口令时,系统首先会要求输入旧密码,通过后再设新密码,这是为了防止会话被他人冒用后随意篡改。
从实现机制看,passwd命令会调用PAM(可插拔认证模块)中的pam_unix.so,由它负责校验复杂度、写入shadow文件。因此密码策略如最小长度、不能含用户名等,实际是在/etc/pam.d/common-password里配置的,而不是passwd自身写死的逻辑。
二、非交互式批量加密码
在自动化运维中,我们经常需要一键给多个用户初始化口令。这时可以用管道把密码喂给passwd的stdin模式:
# 使用chpasswd批量设置,格式为 用户名:密码 echo 'devuser:Abc123456' | chpasswd # 或使用passwd的stdin参数 echo 'Abc123456' | passwd --stdin devuser
需要注意,上面两种写法里明文密码会出现在shell历史或进程列表(ps)中,在多用户主机上有泄露风险。更安全的做法是先生成加密哈希,再写进shadow:
# 用openssl生成sha512加密串 openssl passwd -6 'Abc123456' # 输出类似:$6$randomsalt$abcdef... # 随后用usermod写入 usermod -p '$6$randomsalt$abcdef...' devuser
chpasswd命令默认读取标准输入中的“用户:密码”行,支持一次处理多行,适合在初始化脚本里使用。但它同样不要在公享终端直接敲,建议从权限受限的文件重定向读取。
三、/etc/shadow文件结构说明
理解passwd修改了什么,有助于排查“命令执行了却登不进”的问题。shadow文件每一行对应一个用户,用冒号分隔九个字段:
| 字段序号 | 含义 | 示例 |
|---|---|---|
| 1 | 用户名 | devuser |
| 2 | 加密密码(!或*表示锁定) | $6$salt$hash |
| 3 | 上次修改日期(距1970天数) | 19500 |
| 4 | 最小间隔天数 | 0 |
| 5 | 最大有效天数 | 99999 |
| 6 | 警告天数 | 7 |
| 7 | 失效宽限天数 | 0 |
| 8 | 账户过期日期 | 空 |
| 9 | 保留字段 | 空 |
如果字段二是感叹号开头(如! $6$...),说明账户被锁定,即便有哈希也不能登录。用passwd -u可解锁,useradd创建用户未设密码时默认就是!,所以新用户必须跑一次passwd才能用。
通过直接观察shadow,我们能确认密码是否真的写进去了,也能看出密码过期策略。比如最大有效天数是30的话,每隔一个月用户就被迫改密,这对安全合规很有用,但也可能造成脚本账号突然失效,需要提前规划。
四、常见误区与权限控制
一个常见错误是以为useradd的-p参数可以直接写明文密码。实际上-p后面跟的必须是已经加密的哈希,写明文会导致登录永远失败:
# 错误示范:把明文当哈希写入,登录必失败 useradd -p 'Abc123456' test1 # 正确示范:先加密再传入 useradd -p "$(openssl passwd -6 'Abc123456')" test2
另外,普通用户执行passwd只能改自己,且新密码若太简单会被PAM拒绝;root则不受复杂度限制,但随意设弱密码会拖垮整台机器安全。建议管理员用pwgen或openssl随机生成,再通过加密串下发。
当系统启用了SELinux或严格审计时,passwd还会受上下文约束,比如在chroot环境里直接跑可能报无法访问shadow。此时应先挂载相关proc与securityfs,或改用chroot内的完整工具链,避免半途锁死账户。
五、锁定与过期管理配合
加密码只是账户生命周期的一步。配合passwd的其他参数,能实现更细粒度控制:
passwd -l 用户名:锁定账户,在shadow密码前加!passwd -u 用户名:解锁账户passwd -e 用户名:强制用户下次登录改密passwd -x 30 用户名:设置密码30天最长有效期
比如新员工入职,先由脚本用chpasswd设初始密码,再passwd -e强制其首次登录自己改掉,既保证可登录又避免密码长期不变。这种组合比单纯加密码更符合企业安全规范。
从整体看,Linux给用户加密码的命令以passwd为核心,辅以chpasswd和usermod的-p选项。掌握它们与shadow、PAM的关系,才能既快又稳地完成系统账户管理,不踩明文泄露或锁定失效的坑。
linuxpasswduser_password修改时间:2026-08-06 22:30:18