| 类型 | UID范围 | 说明 |
|---|---|---|
| 超级用户 | 0 | root,拥有全部权限 |
| 系统用户 | 1-999 | 服务进程使用,不允许登录 |
| 普通用户 | 1000+ | 实际用户,受限权限 |
# 格式:用户名:密码占位:UID:GID:注释:家目录:Shell
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
user1:x:1000:1000:User One:/home/user1:/bin/bash
$ cat /etc/passwd | head -10
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
| 字段 | 说明 | 示例 |
|---|---|---|
| 用户名 | 登录名,1-32字符 | root |
| 密码 | x表示存在shadow文件中 | x |
| UID | 用户ID号 | 0 |
| GID | 主组ID号 | 0 |
| 注释 | GECOS,用户描述信息 | root |
| 家目录 | 用户登录后的初始目录 | /root |
| Shell | 登录Shell,/sbin/nologin禁止登录 | /bin/bash |
# 格式:用户名:加密密码:最后修改:最小间隔:最大有效期:警告:不活动:过期日期:保留
root:$6$salt$hash:19000:0:99999:7:::
$ sudo cat /etc/shadow 2>/dev/null | head -5
root:!*:20512:0:99999:7::: daemon:*:19836:0:99999:7::: bin:*:19836:0:99999:7::: sys:*:19836:0:99999:7::: sync:*:19836:0:99999:7:::
| 前缀 | 算法 | 安全性 |
|---|---|---|
| $1$ | MD5 | ❌ 已破解 |
| $5$ | SHA-256 | ⚠️ 不推荐 |
| $6$ | SHA-512 | ✅ 推荐 |
| $y$ | yescrypt | ✅ 最新推荐 |
$ cat /etc/group | head -10
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,ubuntu tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9:
# 基本创建
sudo useradd username
# 完整创建(推荐)
sudo useradd -m -s /bin/bash -c "Zhang San" -G sudo,docker zhangsan
# -m: 创建家目录
# -s: 指定Shell
# -c: 注释信息
# -G: 附加组
# 指定UID和主组
sudo useradd -u 2000 -g developers -m wangwu
# 设置密码
sudo passwd zhangsan
# 使用adduser(Debian/Ubuntu交互式创建)
sudo adduser zhangsan
$ which useradd; which adduser
N/A
# 修改注释
sudo usermod -c "New Name" username
# 添加附加组
sudo usermod -aG docker username # -a: 追加,不加会覆盖
# 修改主组
sudo usermod -g newgroup username
# 修改Shell
sudo usermod -s /bin/zsh username
# 锁定/解锁账户
sudo usermod -L username # 锁定
sudo usermod -U username # 解锁
# 修改家目录(移动旧目录)
sudo usermod -d /new/home -m username
# 删除用户(保留家目录)
sudo userdel username
# 删除用户及家目录
sudo userdel -r username
# 查找用户拥有的文件
sudo find / -user username 2>/dev/null
# 创建组
sudo groupadd developers
sudo groupadd -g 2000 testers # 指定GID
# 修改组
sudo groupmod -n devteam developers # 改名
sudo groupmod -g 2001 testers # 改GID
# 删除组
sudo groupdel devteam
# 查看用户所属组
groups username
id username
$ id
uid=0(root) gid=0(root) groups=0(root)
# 切换到root
su - # 完整环境(推荐)
su # 仅切换用户,保留当前环境
# 切换到其他用户
su - username
# 以root执行单个命令
su -c "command"
# 编辑sudoers(必须用visudo!)
sudo visudo
# 常见配置
# 用户级别
username ALL=(ALL:ALL) ALL # 完全sudo权限
username ALL=(ALL) NOPASSWD:ALL # 免密sudo
# 组级别
%sudo ALL=(ALL:ALL) ALL # sudo组
%docker ALL=(ALL) NOPASSWD: /usr/bin/docker # 限制命令
# /etc/sudoers.d/ 目录(推荐方式)
echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/username
sudo chmod 440 /etc/sudoers.d/username
visudo命令,它会检查语法错误,防止配置错误导致无法sudo。
$ cat /etc/login.defs | grep -v '^#' | grep -v '^$' | head -20
MAIL_DIR /var/mail FAILLOG_ENAB yes LOG_UNKFAIL_ENAB no LOG_OK_LOGINS no SYSLOG_SU_ENAB yes SYSLOG_SG_ENAB yes FTMP_FILE /var/log/btmp SU_NAME su HUSHLOGIN_FILE .hushlogin ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games TTYGROUP tty TTYPERM 0600 ERASECHAR 0177 KILLCHAR 025 UMASK 022 HOME_MODE 0750 PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_WARN_AGE 7
$ ls -la /etc/skel
total 28 drwxr-xr-x 2 root root 4096 Apr 23 2024 . drwxr-xr-x 130 root root 12288 May 19 21:32 .. -rw-r--r-- 1 root root 220 Mar 31 2024 .bash_logout -rw-r--r-- 1 root root 3771 Mar 31 2024 .bashrc -rw-r--r-- 1 root root 807 Mar 31 2024 .profile
/etc/skel目录的内容会在创建用户时(使用-m选项)自动复制到用户家目录。可以在此放置默认配置文件。
# 1. 检查账户是否被锁定
sudo passwd -S username
# 2. 检查Shell是否正确
grep username /etc/passwd
# 3. 检查密码是否过期
sudo chage -l username
# 4. 检查是否在登录限制文件中
grep username /etc/security/access.conf 2>/dev/null
# 5. 查看登录日志
sudo journalctl -u sshd | grep username
sudo lastb | grep username # 失败的登录
# 需要root权限修复
su -
visudo
# 添加: username ALL=(ALL:ALL) ALL
# 或使用pkexec(桌面环境)
pkexec visudo
# 批量创建用户脚本
#!/bin/bash
# create-users.sh
while read username fullname; do
sudo useradd -m -s /bin/bash -c "$fullname" "$username"
echo "$username:ChangeMe123!" | sudo chpasswd
sudo passwd -e "$username" # 强制首次登录修改密码
echo "Created user: $username"
done << userlist.txt
zhangsan 张三
lisi 李四
wangwu 王五
userlist.txt
# 批量删除
cut -d: -f1 userlist.txt | while read user; do
sudo userdel -r "$user" 2>/dev/null
done
# 1. 创建用户dev1,附加组sudo和docker
sudo useradd -m -s /bin/bash -G sudo,docker dev1
sudo passwd dev1
# 2. 创建用户dev2
sudo useradd -m -s /bin/bash dev2
# 3. 创建组developers
sudo groupadd developers
# 4. 将dev1和dev2加入developers
sudo usermod -aG developers dev1
sudo usermod -aG developers dev2
# 5. 验证
id dev1
id dev2
groups dev1
# 6. 清理
sudo userdel -r dev1
sudo userdel -r dev2
sudo groupdel developers
✅ 理解用户/组分类与UID/GID
✅ 掌握用户增删改查命令
✅ 理解passwd/shadow/group文件
✅ 学会sudo配置与用户切换
企业环境通常使用LDAP(OpenLDAP/389 DS)或AD(Active Directory)集中管理用户,而非在每台服务器上手动创建。
# 安装LDAP客户端
sudo apt install libpam-ldapd nscd
# 配置/etc/nslcd.conf
uri ldap://ldap.example.com
base dc=example,dc=com
# 配置NSS
# /etc/nsswitch.conf
passwd: files ldap
group: files ldap
shadow: files ldap
# 配置PAM自动创建家目录
# /etc/pam.d/common-session
session optional pam_mkhomedir.so skel=/etc/skel umask=077
| 特性 | 本地用户 | LDAP用户 |
|---|---|---|
| 存储位置 | /etc/passwd | LDAP目录 |
| 管理方式 | 逐台服务器 | 集中管理 |
| 适用规模 | <50台服务器 | 任意规模 |
| 单点登录 | 否 | 是 |
| 依赖 | 无 | LDAP服务器可用 |
# 密码策略设置
# 修改密码过期策略
sudo chage -M 90 username # 90天后过期
sudo chage -m 7 username # 最少7天才能改密码
sudo chage -W 14 username # 提前14天警告
sudo chage -l username # 查看策略
# 锁定/解锁账户
sudo passwd -l username # 锁定
sudo passwd -u username # 解锁
sudo usermod -L username # 锁定(另一种方式)
sudo usermod -U username # 解锁
# 强制下次登录修改密码
sudo passwd -e username
sudo chage -d 0 username