在 Linux 系统管理中,用户密码的修改是一项基础且频繁的操作。无论是个人用户更新自己的密码,还是系统管理员管理服务器上的众多账户,掌握高效且安全的密码修改方法都至关重要。在云栈社区的运维板块,我们经常讨论此类基础而关键的技能。本文将为你详细介绍三种常用的命令行方法,并附带安全实践建议,帮助你更专业地处理密码管理任务。
使用 passwd 命令
在Linux系统中,passwd 无疑是修改用户密码最直接、最常用的命令。它的具体行为会根据执行用户的权限而有所不同。
当你以 root 身份登录时,权限是最大的。如果直接在终端输入 passwd 命令而不带任何参数,系统会默认修改 root 用户自身的密码。更重要的是,root 用户可以为任何其他用户修改密码,且无需知道该用户的旧密码,命令格式为 passwd [用户名]。
[root@localhost ~]# passwd jacktian
更改用户 jacktian 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
如果你以普通用户身份登录,权限则受到限制。此时输入 passwd 命令,只能修改当前登录用户自己的密码。系统会要求你先输入一次旧密码进行验证,通过后才能设置新密码。
[jacktian@localhost ~]$ passwd
更改用户 jacktian 的密码 。
为 jacktian 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
无论哪种情况,新密码通常都需要满足一定的复杂度规则以提高系统安全性。大多数 Linux 发行版会要求密码长度至少为 6 到 8 位,并鼓励混合使用大小写字母、数字和特殊字符。输入时,为了安全起见,密码字符不会回显在屏幕上,因此务必确保两次输入的新密码完全一致,否则修改会失败。
使用 chpasswd 命令
chpasswd 命令的设计初衷是为了批量修改密码,非常适合系统管理员在初始化环境或重置大量用户密码时使用。该命令从标准输入读取用户名和密码对,其格式必须严格为 用户名:密码。
一种常见的用法是先将用户名和新密码(明文)编辑在一个文本文件中,例如 passwords.txt:
user1:newpasswd1
user2:newpasswd2
然后通过管道将文件内容传递给 chpasswd 命令:
cat /home/jacktian/passwords.txt | chpasswd
执行后,文件中列出的用户密码就会被批量更新。
重要安全提醒:由于密码在该文件中以明文形式存在,必须确保该文件只有 root 用户可读,并且在完成操作后立即删除或移至安全位置,以防密码泄露。
除了批量操作,chpasswd 也可以用于以非交互式的方式修改单个用户的密码,避免手动重复输入:
echo “user:newpasswd” | chpasswd
使用 usermod 命令
usermod 命令通常用于修改用户账户的各项属性,其 -p 或 –password 选项可以直接设置用户的密码。但这里有一个关键点:usermod -p 要求提供的密码是已经加密过的字符串,而不是明文密码。
因此,流程分为两步:
- 生成加密密码:使用
openssl passwd 等工具生成加密后的密码字符串。
- 应用加密密码:将生成的加密字符串通过
usermod -p 赋给对应用户。
例如,我们可以用以下命令生成一个用 MD5 算法加密的密码(newpassword 替换为你的实际密码):
openssl passwd -1 -salt $(date +%s) newpassword
这条命令使用当前 Unix 时间戳作为“盐值”(salt),对密码进行 MD5 加密。命令会输出一个类似 $1$<salt>$<encrypted_password> 格式的字符串,这就是加密后的密码。
接着,使用 usermod 命令应用这个加密密码:
usermod -p ‘$1$1678889200$X4h2V8q9Y3fZ1A...’ username
将单引号内的加密字符串和 username 替换为对应的值即可。
安全实践总结
虽然 chpasswd 和 usermod -p 在脚本自动化中很有用,但必须警惕其安全风险:
- 避免密码明文出现在命令行历史或脚本中:上述方法中的密码(无论是明文还是加密字符串)都可能被
history 命令或进程查看工具捕获。
- 首选交互式
passwd 命令:对于日常操作,尤其是在有多人在场的环境中,使用 passwd 命令交互式地输入密码是更安全的选择,因为密码不会以任何形式显示在屏幕上或记录在明文中。
- 加密字符串并非绝对安全:
usermod -p 使用的加密字符串虽然不可逆,但如果被他人获取,可以直接用于登录,无需解密。
因此,在自动化脚本中,更安全的做法是结合 expect 脚本或使用 SSH 密钥认证等免密方式。对于手动操作,养成良好的习惯,遵循系统正常的密码修改流程,是保障账户安全的第一道防线。