Skip to content

用户和组管理

本章将介绍 Linux 中的用户和组管理,包括用户账户的创建、修改、删除,以及用户组的管理,这是系统管理的基础知识。

用户和组概述

用户概念

Linux 是多用户操作系统,每个用户都有唯一的用户 ID(UID)。

mermaid
graph TD
    A[用户类型] --> B[超级用户 root]
    A --> C[系统用户]
    A --> D[普通用户]
    
    B --> B1[UID: 0]
    C --> C1[UID: 1-999]
    D --> D1[UID: 1000+]

用户类型

类型UID 范围说明
超级用户0root,拥有最高权限
系统用户1-999系统服务运行账户
普通用户1000+普通登录用户

组概念

组是用户的集合,用于简化权限管理。

bash
# 查看当前用户
whoami

# 查看当前用户 UID
id -u

# 查看当前用户 GID
id -g

# 查看用户所属的所有组
groups

# 查看完整用户信息
id
# 输出:uid=1000(user) gid=1000(user) groups=1000(user),4(adm),27(sudo)

相关配置文件

bash
# 用户账户信息
/etc/passwd

# 用户密码信息
/etc/shadow

# 组信息
/etc/group

# 组密码信息
/etc/gshadow

# 查看文件内容
cat /etc/passwd | head -5
# 格式:用户名:密码占位符:UID:GID:描述:家目录:Shell
# 示例:root:x:0:0:root:/root:/bin/bash

cat /etc/shadow | head -5
# 格式:用户名:加密密码:上次修改:最小天数:最大天数:警告:不活动:过期:保留

cat /etc/group | head -5
# 格式:组名:密码占位符:GID:组成员列表

用户管理

useradd - 创建用户

bash
# useradd - 创建新用户

# 基本创建
sudo useradd username

# 创建用户并创建家目录
sudo useradd -m username

# 创建用户并指定 Shell
sudo useradd -m -s /bin/bash username

# 创建用户并指定 UID
sudo useradd -m -u 2000 username

# 创建用户并指定主组
sudo useradd -m -g groupname username

# 创建用户并指定附加组
sudo useradd -m -G sudo,docker username

# 创建用户并添加注释
sudo useradd -m -c "John Doe" username

# 创建系统用户
sudo useradd -r -s /usr/sbin/nologin serviceuser

# 创建用户并设置密码
sudo useradd -m username
sudo passwd username

# 完整示例
sudo useradd -m -s /bin/bash -G sudo,adm -c "John Doe" john

# 常用选项:
# -m: 创建家目录
# -M: 不创建家目录
# -s: 指定登录 Shell
# -u: 指定 UID
# -g: 指定主组(GID 或组名)
# -G: 指定附加组(逗号分隔)
# -c: 添加注释
# -d: 指定家目录路径
# -e: 指定账户过期日期
# -r: 创建系统用户

adduser - 交互式创建用户

bash
# adduser - 交互式创建用户(Debian/Ubuntu)

# 交互式创建用户
sudo adduser username
# 会提示输入密码、全名、电话等信息

# 创建系统用户
sudo adduser --system --group --no-create-home serviceuser

# 创建用户并添加到组
sudo adduser username sudo

usermod - 修改用户

bash
# usermod - 修改用户属性

# 修改用户名
sudo usermod -l newname oldname

# 修改用户 Shell
sudo usermod -s /bin/zsh username

# 修改用户家目录
sudo usermod -d /new/home username
sudo usermod -d /new/home -m username    # 同时移动原家目录内容

# 修改用户主组
sudo usermod -g newgroup username

# 添加附加组
sudo usermod -aG docker username

# 设置附加组(覆盖原有)
sudo usermod -G sudo,docker username

# 修改用户 UID
sudo usermod -u 2001 username

# 锁定用户
sudo usermod -L username

# 解锁用户
sudo usermod -U username

# 设置账户过期日期
sudo usermod -e 2024-12-31 username

# 设置密码过期
sudo usermod -p $(date +%Y-%m-%d) username

# 修改注释
sudo usermod -c "New Comment" username

# 常用示例
# 将用户添加到 sudo 组
sudo usermod -aG sudo username

# 修改用户 Shell 为 zsh
sudo usermod -s /bin/zsh username

# 锁定用户账户
sudo usermod -L username

userdel - 删除用户

bash
# userdel - 删除用户

# 删除用户(保留家目录)
sudo userdel username

# 删除用户和家目录
sudo userdel -r username

# 删除用户及其所有文件
sudo userdel -r -f username

# 查找用户文件
sudo find / -user username

# 删除前检查用户进程
ps -u username

# 终止用户进程
sudo killall -u username

passwd - 密码管理

bash
# passwd - 管理用户密码

# 修改当前用户密码
passwd

# 修改指定用户密码(需要 root)
sudo passwd username

# 锁定用户密码
sudo passwd -l username

# 解锁用户密码
sudo passwd -u username

# 删除用户密码(无密码登录)
sudo passwd -d username

# 显示密码状态
sudo passwd -S username
# 输出:username P 01/15/2024 0 99999 7 -1

# 设置密码过期
sudo passwd -e username

# 设置最小密码使用天数
sudo passwd -n 7 username

# 设置最大密码使用天数
sudo passwd -x 90 username

# 设置过期警告天数
sudo passwd -w 7 username

# 设置账户不活动天数
sudo passwd -i 30 username

chage - 密码过期管理

bash
# chage - 管理密码过期信息

# 查看密码过期信息
sudo chage -l username

# 设置密码过期日期
sudo chage -E 2024-12-31 username

# 设置最大密码使用天数
sudo chage -M 90 username

# 设置最小密码使用天数
sudo chage -m 7 username

# 设置过期警告天数
sudo chage -W 7 username

# 设置账户不活动天数
sudo chage -I 30 username

# 设置上次修改密码日期
sudo chage -d 2024-01-01 username

# 永不过期
sudo chage -E -1 username

组管理

groupadd - 创建组

bash
# groupadd - 创建新组

# 创建组
sudo groupadd groupname

# 创建组并指定 GID
sudo groupadd -g 2000 groupname

# 创建系统组
sudo groupadd -r systemgroup

# 创建组并设置密码
sudo groupadd groupname
sudo gpasswd groupname

groupmod - 修改组

bash
# groupmod - 修改组属性

# 修改组名
sudo groupmod -n newname oldname

# 修改 GID
sudo groupmod -g 2001 groupname

groupdel - 删除组

bash
# groupdel - 删除组

# 删除组
sudo groupdel groupname

# 注意:不能删除用户的主组
# 需要先删除用户或修改用户的主组

gpasswd - 组密码管理

bash
# gpasswd - 管理组密码和成员

# 设置组密码
sudo gpasswd groupname

# 删除组密码
sudo gpasswd -r groupname

# 添加用户到组
sudo gpasswd -a username groupname

# 从组中删除用户
sudo gpasswd -d username groupname

# 设置组管理员
sudo gpasswd -A admin groupname

# 设置组成员(覆盖)
sudo gpasswd -M user1,user2,user3 groupname

gpasswd 相关文件

bash
# /etc/gshadow - 组密码文件
# 格式:组名:加密密码:组管理员:组成员

# 查看组信息
cat /etc/group | grep groupname

用户信息查询

id - 显示用户信息

bash
# id - 显示用户和组信息

# 显示当前用户信息
id

# 显示指定用户信息
id username

# 只显示 UID
id -u username

# 只显示 GID
id -g username

# 只显示主组 GID
id -g

# 显示所有组 GID
id -G username

# 显示用户名而非 ID
id -un
id -gn

who 和 w - 查看登录用户

bash
# who - 显示登录用户

who
# 输出:user    pts/0    2024-01-15 10:30 (192.168.1.100)

# 显示详细信息
who -a

# 只显示用户名
who -q

# 显示运行级别
who -r

# w - 显示登录用户及其活动

w
# 输出:
# USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
# user     pts/0    192.168.1.100    10:30    1.00s  0.05s  0.00s w

# 显示标题
w -h

# 显示短格式
w -s

last - 登录历史

bash
# last - 显示登录历史

last
# 输出:user    pts/0    192.168.1.100    Mon Jan 15 10:30 - 11:30  (01:00)

# 显示指定用户
last username

# 显示指定数量的记录
last -n 10

# 显示重启记录
last reboot

# 显示失败登录
lastb

# 显示所有信息
last -F

# 显示 IP 地址
last -i

users 和 finger

bash
# users - 显示登录用户名
users
# 输出:user1 user2 user3

# finger - 显示用户信息(需要安装)
finger username
# 输出用户详细信息

# 安装 finger
sudo apt install finger    # Debian/Ubuntu
sudo yum install finger    # RHEL/CentOS

用户切换

su - 切换用户

bash
# su - 切换用户

# 切换到 root
su
su -

# 切换到指定用户
su username
su - username    # 同时切换环境变量

# 以指定用户执行命令
su -c "command" username

# 使用登录 Shell
su -l username

# 保留当前环境变量
su -p username

# su 和 su - 的区别:
# su: 保留当前用户的环境变量
# su -: 加载目标用户的环境变量(推荐)

sudo - 以超级用户执行

bash
# sudo - 以超级用户或其他用户身份执行命令

# 以 root 执行命令
sudo command

# 以指定用户执行命令
sudo -u username command

# 切换到 root Shell
sudo -i
sudo su -

# 编辑文件
sudo vim /etc/hosts

# 查看可以执行的命令
sudo -l

# 刷新 sudo 缓存(重新输入密码)
sudo -k

# 后台执行
sudo -b command

# 显示版本
sudo -V

# 常用示例
sudo apt update
sudo systemctl restart nginx
sudo tail -f /var/log/syslog

sudo 配置

bash
# /etc/sudoers - sudo 配置文件

# 使用 visudo 编辑(推荐)
sudo visudo

# 配置格式:
# 用户    主机=(运行身份)    命令

# 示例配置:

# 允许用户执行所有命令
username ALL=(ALL:ALL) ALL

# 允许用户执行特定命令
username ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl

# 允许用户无密码执行命令
username ALL=(ALL) NOPASSWD: ALL

# 允许组执行所有命令
%sudo   ALL=(ALL:ALL) ALL

# 允许用户以其他用户身份执行命令
username ALL=(www-data) /usr/bin/systemctl restart nginx

# 别名定义
# 用户别名
User_Alias WEBMASTERS = user1, user2

# 命令别名
Cmnd_Alias WEB = /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart apache2

# 使用别名
WEBMASTERS ALL=(ALL) WEB

批量用户管理

批量创建用户

bash
# 使用脚本批量创建用户

#!/bin/bash
# 批量创建用户脚本

# 用户列表文件格式:用户名:密码:UID:GID:注释:家目录:Shell
while IFS=: read -r username password uid gid comment home shell
do
    # 创建用户
    useradd -m -u "$uid" -g "$gid" -c "$comment" -d "$home" -s "$shell" "$username"
    
    # 设置密码
    echo "$username:$password" | chpasswd
    
    echo "用户 $username 创建成功"
done < users.txt

# users.txt 示例内容:
# user1:password1:1001:1001:User One:/home/user1:/bin/bash
# user2:password2:1002:1002:User Two:/home/user2:/bin/bash

批量修改密码

bash
# 使用 chpasswd 批量修改密码

# 从文件读取
cat passwords.txt | chpasswd

# passwords.txt 格式:
# username1:password1
# username2:password2

# 或使用管道
echo "username:password" | sudo chpasswd

newusers - 批量创建用户

bash
# newusers - 批量创建或更新用户

# 从文件创建用户
sudo newusers users.txt

# users.txt 格式(与 /etc/passwd 相同):
# username:password:uid:gid:comment:home:shell
# user1:password1:1001:1001:User One:/home/user1:/bin/bash
# user2:password2:1002:1002:User Two:/home/user2:/bin/bash

用户配置文件

/etc/login.defs

bash
# /etc/login.defs - 用户账户配置

# 查看配置
cat /etc/login.defs

# 主要配置项:
# MAIL_DIR        /var/mail        # 邮件目录
# PASS_MAX_DAYS   99999            # 密码最大使用天数
# PASS_MIN_DAYS   0                # 密码最小使用天数
# PASS_WARN_AGE   7                # 密码过期警告天数
# UID_MIN         1000             # 普通 UID 最小值
# UID_MAX         60000            # 普通 UID 最大值
# GID_MIN         1000             # 普通 GID 最小值
# GID_MAX         60000            # 普通 GID 最大值
# CREATE_HOME     yes              # 是否创建家目录
# UMASK           022              # 默认 umask

/etc/default/useradd

bash
# /etc/default/useradd - useradd 默认配置

# 查看配置
cat /etc/default/useradd

# 或使用命令查看
useradd -D

# 主要配置项:
# GROUP=100                       # 默认组
# HOME=/home                      # 家目录基路径
# INACTIVE=-1                     # 密码过期后账户不活动天数
# EXPIRE=                         # 账户过期日期
# SHELL=/bin/sh                   # 默认 Shell
# SKEL=/etc/skel                  # 家目录模板
# CREATE_MAIL_SPOOL=yes           # 创建邮件目录

# 修改默认配置
sudo useradd -D -s /bin/bash
sudo useradd -D -b /home/users

/etc/skel

bash
# /etc/skel - 家目录模板

# 查看模板内容
ls -la /etc/skel

# 创建用户时会复制这些文件到用户家目录
# 可以添加默认配置文件

# 示例:添加默认 .vimrc
sudo cp /path/to/.vimrc /etc/skel/

# 添加默认 .bashrc 配置
sudo bash -c 'echo "alias ll=\"ls -la\"" >> /etc/skel/.bashrc'

小结

本章介绍了 Linux 用户和组管理:

内容命令功能
用户创建useradd, adduser创建新用户
用户修改usermod修改用户属性
用户删除userdel删除用户
密码管理passwd, chage管理密码和过期策略
组创建groupadd创建组
组修改groupmod修改组属性
组删除groupdel删除组
组成员gpasswd管理组成员
用户查询id, who, w, last查看用户信息
用户切换su, sudo切换用户身份

常用命令速查

bash
# 用户管理
sudo useradd -m -s /bin/bash username    # 创建用户
sudo passwd username                      # 设置密码
sudo usermod -aG sudo username            # 添加到 sudo 组
sudo userdel -r username                  # 删除用户

# 组管理
sudo groupadd groupname                   # 创建组
sudo gpasswd -a username groupname        # 添加用户到组
sudo groupdel groupname                   # 删除组

# 用户查询
id username                               # 查看用户信息
who                                       # 查看登录用户
last                                      # 查看登录历史

# 用户切换
su - username                             # 切换用户
sudo command                              # 以 root 执行命令

下一步

下一章我们将学习 权限管理,深入了解 Linux 的文件权限系统。