useradd 创建用户需显式指定 -m、-s /bin/bash 并执行 passwd 设置密码,否则账户无法登录;adduser 是交互式封装,默认完成这三项且更安全。

useradd 是创建新系统用户的底层命令,但直接跑 useradd username 会生成一个无法登录的锁定账户——没家目录、没 shell、没密码,连 su - username 都会失败。必须显式指定关键参数,或改用更安全的 adduser。
用 useradd 创建可登录用户必须补全这三项
useradd 默认极简:不建家目录、不设 shell、不提示设密码。漏掉任意一项,用户就“存在但不可用”。
-
-m:强制创建家目录(/home/username),否则su -会报错 “No directory, logging in with HOME=/” -
-s /bin/bash:显式指定 shell;若省略,部分系统默认写/usr/sbin/nologin或空字段,导致登录后立即退出 -
sudo passwd username:必须单独执行,useradd本身不处理密码
示例:
sudo useradd -m -s /bin/bash alice sudo passwd alice
验证是否生效:
getent passwd alice # 看 shell 字段是不是 /bin/bash ls -ld /home/alice # 看目录是否存在且属主是 alice
adduser 为什么更适合日常使用
adduser 是 useradd 的交互式封装,在 Ubuntu/Debian 及多数现代发行版中预装,它默认完成三件事:-m、/bin/bash、调用 passwd 提示设密码——一步到位,不易漏。
- 运行
sudo adduser bob后,会逐项提示:密码、全名、房间号等(除密码外全可回车跳过) - 自动复制
/etc/skel/下的配置文件(如.bashrc),家目录权限也设为正确值(755) - 不需要记参数,也不用担心 shell 字段写错
注意:adduser 在 RHEL/CentOS 中只是 useradd 的软链接,行为不同;若不确定,先运行 type adduser 确认它是脚本还是链接。
创建后仍无法 su - 或 SSH 登录?检查这三个点
即使参数都写了,仍可能卡在登录环节:
- 家目录权限错误:必须是
drwxr-xr-x(755),且属主属组为该用户,否则su -拒绝进入 -
/etc/passwd中 shell 字段为空或非法路径(如拼错成/bin/bas),可用getent passwd username | cut -d: -f7检查 - 用户被锁:查看
/etc/shadow第二字段,若为<em></em>或!,说明密码被禁用(常见于用-p ''创建的服务账户)
SSH 登录失败还常因 SELinux 上下文未初始化(尤其在 CentOS/RHEL),此时需运行 sudo restorecon -Rv /home/username。
批量创建用户时别硬编码密码
脚本里用echo "password" | sudo passwd --stdin username(RHEL)或 chpasswd(Debian)虽可行,但明文密码易泄露、审计难。
- 更稳妥的做法:用
useradd -m -s /bin/bash -p "$(openssl passwd -1 'rawpass')"(仅限旧版 MD5) - 生产环境强烈建议创建后禁用密码,改用
ssh-copy-id部署密钥,并设sudo usermod -p '*' username
真正麻烦的从来不是命令怎么敲,而是家目录权限、shell 字段、shadow 密码锁状态这三处细节——它们不报错,只静默拒绝登录。


















