Linux中为新用户设初始密码不能直接用useradd -p传明文,必须先用openssl passwd -6生成$6$开头的SHA-512哈希值再传入;否则明文会被原样写入shadow导致无法登录。

Linux 中为新用户指定加密初始密码,不能直接用明文传入 useradd -p,因为该选项要求的是**已加密的密码字符串**(即 shadow 文件中存储的那种哈希值),而非明文。误用明文会导致账户无法登录。
正确做法:先加密再创建用户
使用 openssl passwd 生成兼容 shadow 格式的加密密码,再传给 useradd -p:
-
SHA-256 加密(推荐):
openssl passwd -6 'mypassword123'(-6表示 SHA-512,比-5更常用且安全;部分系统也支持-6) -
输出示例:
$6$abc123...$xyz789...(一长串以$6$开头的哈希) -
创建用户并设密:
useradd -p '$6$abc123...$xyz789...' username
注意 useradd -p 的限制
该方式创建的用户虽有密码字段,但仍有几个关键点需留意:
- 用户家目录、shell、组等仍按系统默认(
/etc/login.defs和/etc/default/useradd)配置,如需自定义要加对应参数(如-d、-s、-g) - 密码未设置过期策略,后续可用
chage补充(如chage -M 90 username) - 部分老版本或精简系统可能不支持直接解析
$6$哈希,建议优先用passwd命令后续设置
更稳妥的替代流程
对生产环境,推荐分两步操作,避免加密格式兼容性问题:
- 先创建用户:
useradd -m -s /bin/bash username - 再设密码:
echo 'username:mypassword123' | chpasswd(root 权限下,支持批量) - 或交互式设密:
passwd username(输入两次明文,系统自动加密存入/etc/shadow)
为什么不能直接用 useradd -p '123456'?
因为 -p 后面的字符串会被原样写入 /etc/shadow 的密码字段。若填明文,系统会把它当做一个“已加密但无效”的密码处理——实际存储为 123456(无哈希标识),导致任何密码都无法通过验证。只有带 $id$salt$hash 结构的字符串才是合法加密密码。


















