Appearance
用户和组管理
本章将介绍 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 范围 | 说明 |
|---|---|---|
| 超级用户 | 0 | root,拥有最高权限 |
| 系统用户 | 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 sudousermod - 修改用户
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 usernameuserdel - 删除用户
bash
# userdel - 删除用户
# 删除用户(保留家目录)
sudo userdel username
# 删除用户和家目录
sudo userdel -r username
# 删除用户及其所有文件
sudo userdel -r -f username
# 查找用户文件
sudo find / -user username
# 删除前检查用户进程
ps -u username
# 终止用户进程
sudo killall -u usernamepasswd - 密码管理
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 usernamechage - 密码过期管理
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 groupnamegroupmod - 修改组
bash
# groupmod - 修改组属性
# 修改组名
sudo groupmod -n newname oldname
# 修改 GID
sudo groupmod -g 2001 groupnamegroupdel - 删除组
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 groupnamegpasswd 相关文件
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 -gnwho 和 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 -slast - 登录历史
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 -iusers 和 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/syslogsudo 配置
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 chpasswdnewusers - 批量创建用户
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 的文件权限系统。
