useradd 是什么
useradd 用于创建本地账号,它维护 /etc/passwd、/etc/shadow、/etc/group 与 /etc/gshadow 四份文件,并按需创建家目录、复制骨架文件。不同发行版的默认行为差异明显:RHEL 系默认不创建家目录,Debian 系提供的 adduser 是更友好的封装(交互式、默认创建家目录)。如果不显式指定 shell、家目录与组,创建出来的账号往往可用性很差,这就是「加了用户却登录不了」的根源。
基本信息
| 适用平台 | Linux 全发行版(shadow-utils 或 passwd 包);RHEL 系与 Debian 系默认参数不同,adduser 在 Debian 系是封装脚本、在 RHEL 系是指向 useradd 的软链接 |
|---|---|
| 命令语法 | useradd [选项] 用户名 |
| 常用选项 | -m 创建家目录、-M 不创建、-d 指定家目录路径、-s 指定登录 shell、-u 指定 UID、-g 指定主组、-G 指定附加组、-c 注释、-e 账号过期日期、-r 创建系统账号、-p 直接给定加密后的口令 |
| 默认值来源 | /etc/default/useradd 与 /etc/login.defs 决定默认 shell、家目录基准、UID 范围、是否创建家目录与密码策略 |
| 权限要求 | 需要 root 或 sudo |
典型使用场景
- 开设运维账号:创建带家目录与 bash 的普通用户,加入 sudo 或 wheel 组
- 部署服务账号:用 -r 建系统账号,指定 nologin shell,只用于运行进程
- 统一 UID:跨主机保持同一 UID,避免共享存储上出现权限混乱
- 指定独立家目录:把家目录放到数据盘(-d 与 -m 一起用)
- 附加组授权:用 -G 把用户加入 docker、developers 等附加组完成授权
- 批量开通:配合脚本循环创建,再统一用 chpasswd 设置口令
常用示例
常用示例
useradd -m -s /bin/bash -G wheel,developers deploy
useradd -r -s /sbin/nologin appsvc # 系统账号(无家目录、不可登录)
useradd -u 1500 -d /data/home/deploy -m -s /bin/bash deploy
useradd -m -e 2026-12-31 -c '临时外包账号' temp01
grep deploy /etc/passwd /etc/group
id deploy # 确认 UID、主组与附加组
echo 'deploy:InitPassw0rd!' | chpasswd # 设置初始口令
passwd -S deploy # 确认口令状态为 P(已设置)
chage -d 0 deploy # 下次登录强制改口令常用选项对照
| 选项 | 作用 | 注意 |
|---|---|---|
| -m | 创建家目录并复制 /etc/skel 内容 | RHEL 系默认不创建,务必显式加上 |
| -s | 指定登录 shell | 服务账号用 /sbin/nologin 禁止交互登录 |
| -r | 创建系统账号,UID 取自系统账号范围 | 不用于人类用户 |
| -G | 指定附加组,可逗号分隔多个 | 不会覆盖主组 |
| -g | 指定主组 | 写成 -g 会覆盖已有主组,与 -G 语义完全不同 |
| -e | 账号过期日期 | 外包与临时账号应设置 |
创建后有几个必查项:id 用户名 确认 UID、主组与附加组是否符合预期;passwd -S 用户名 确认口令状态(P 已设置、L 已锁定、NP 无口令);grep 用户名 /etc/passwd 确认家目录与 shell。新账号从未设置口令时,shadow 里的口令字段可能是空或 !,状态需要显式处理。
默认值集中在 /etc/default/useradd 与 /etc/login.defs,例如 CREATE_HOME、SHELL、UID_MIN/UID_MAX、PASS_MAX_DAYS。想统一所有新账号的行为,改这两个文件比每次手工传参更可靠;改完用 useradd -D 查看当前默认值是否符合预期。
不要把服务账号建成可登录的普通用户,也不要用 -p 直接传递明文口令——该参数要求的是已经加密的哈希值,写成明文会导致账号无法登录,且命令会留在历史记录里。设置口令统一用 chpasswd(从标准输入读,不落到命令行)。
查看与修改默认值:useradd -D 打印当前默认的 shell、家目录基准与 UID 范围,也可以用 useradd -D -s /bin/bash 这类写法直接改默认。创建账号属于安全敏感操作,事后应确认 /var/log/secure(RHEL 系)或 /var/log/auth.log(Debian 系)里有 useradd 的记录,有条件时接入集中日志。