0%

linux用户管理

Linux 用户与组管理详解:权限控制的核心机制

Linux 是多用户多任务操作系统,用户与组的管理是系统安全和权限控制的基础。本文将系统讲解用户与组的配置文件、核心管理命令及权限控制逻辑,帮助你掌握 Linux 下的身份管理体系。

用户管理:从配置文件到核心命令

Linux 通过 /etc/passwd/etc/shadow 存储用户信息,通过一系列命令实现用户的创建、修改和删除。

用户信息文件解析

(1)/etc/passwd:用户基本信息

该文件记录所有用户的公开信息,每行对应一个用户,以冒号分隔为 7 个字段:

1
2
3
4
5
6
7
8
9
root:x:0:0:root:/root:/bin/bash
# 字段含义:
# 1. 用户名(root)
# 2. 密码标志(x 表示密码存储在 /etc/shadow)
# 3. UID(用户ID,0 为超级用户,1-499 为系统用户,500+ 为普通用户)
# 4. GID(初始组ID,对应 /etc/group)
# 5. 用户说明(可选,如 root 描述)
# 6. 家目录(/root 为 root 主目录,普通用户默认 /home/用户名)
# 7. 登录Shell(/bin/bash 为可交互Shell,/sbin/nologin 为禁止登录)
(2)/etc/shadow:用户密码信息

存储用户密码的加密信息(仅 root 可读写),每行对应一个用户,以冒号分隔为 9 个字段:

1
2
3
4
5
6
7
8
9
10
11
root:$6$xxxxxxxx$xxxxxx:19500:0:99999:7:::
# 字段含义:
# 1. 用户名(root)
# 2. 加密密码($6$ 表示 SHA-512 加密,* 或 ! 表示账号锁定)
# 3. 最近修改密码时间(距离 1970-01-01 的天数)
# 4. 密码修改间隔(0 表示随时可改)
# 5. 密码有效期(99999 表示永不过期)
# 6. 密码到期前警告天数(7 天前警告)
# 7. 密码到期后宽限天数(过期后仍可登录的天数)
# 8. 账号失效时间(空表示永不过期)
# 9. 保留字段

用户管理核心命令

(1)创建用户:useradd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本语法
useradd [选项] 用户名

# 示例 1:创建普通用户(默认创建家目录 /home/user1)
useradd user1

# 示例 2:自定义家目录和登录Shell
useradd -d /home/newuser -s /bin/bash newuser

# 示例 3:创建系统用户(无家目录,UID < 500)
useradd -r -M sysuser # -r 系统用户,-M 不创建家目录

# 常用选项:
# -c "描述":添加用户说明(如 -c "IT Department")
# -g 组名/ID:指定初始组(默认创建同名组)
# -G 组1,组2:指定附加组(用户可属于多个组)
# -u UID:自定义UID(如 -u 1005)
(2)修改用户:usermod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本语法
usermod [选项] 用户名

# 示例 1:修改用户家目录(需手动移动数据)
usermod -d /home/newhome user1

# 示例 2:锁定用户(禁止登录)
usermod -L user1 # 解锁用 -U

# 示例 3:修改用户所属附加组
usermod -G wheel,users user1 # 覆盖原有附加组
usermod -aG docker user1 # -a 追加新组,不覆盖

# 常用选项:
# -s /sbin/nologin:禁止用户登录(保留账号)
# -u 1006:修改UID(需确保UID未被使用)
# -l 新用户名:修改用户名(如 usermod -l newname oldname)
(3)删除用户:userdel
1
2
3
4
5
6
7
8
# 基本语法
userdel [-r] 用户名

# 示例 1:删除用户(保留家目录)
userdel user1

# 示例 2:删除用户及家目录
userdel -r user1 # 谨慎使用,数据会被删除
(4)设置密码:passwd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本语法
passwd [用户名] # 普通用户只能修改自己的密码

# 示例 1:root 为 user1 设置密码
passwd user1 # 输入两次密码

# 示例 2:普通用户修改自身密码
passwd # 先输入旧密码,再输入新密码

# 常用选项:
# -l:锁定用户(与 usermod -L 类似)
# -u:解锁用户
# -d:清空密码(允许空密码登录,不推荐)
# -e:强制用户下次登录修改密码(如 passwd -e user1)
(5)切换用户:susudo
  • su:切换用户身份(默认切换到 root)

    1
    2
    3
    su - root  # 切换到 root 并加载环境变量(推荐)
    su user1 # 切换到 user1(不加载环境变量)
    su -c "command" # 执行单条命令后返回原用户(如 su -c "ls /root")
  • sudo:以 root 权限执行单条命令(需配置 /etc/sudoers

    1
    2
    3
    sudo ls /root  # 普通用户执行 root 命令
    sudo -i # 切换到 root 环境(需输入当前用户密码)
    sudo -l # 查看当前用户可执行的 sudo 命令

    配置 sudo 权限
    编辑 /etc/sudoers(需用 visudo 命令,避免语法错误):

    1
    2
    3
    4
    5
    visudo
    # 添加一行:允许 user1 执行所有命令
    user1 ALL=(ALL) ALL
    # 允许 user1 免密码执行命令
    user1 ALL=(ALL) NOPASSWD: ALL
(6)查看用户信息
1
2
3
4
whoami        # 显示当前用户名
id user1 # 查看 user1 的 UID、GID 及所属组
who # 显示当前登录的所有用户
w # 显示登录用户及正在执行的命令

组管理:用户的集合与权限分配

组是用户的集合,用于批量管理权限。Linux 通过 /etc/group/etc/gshadow 存储组信息。

组信息文件解析

(1)/etc/group:组基本信息

每行对应一个组,以冒号分隔为 4 个字段:

1
2
3
4
5
6
wheel:x:10:user1,user2
# 字段含义:
# 1. 组名(wheel)
# 2. 组密码标志(x 表示密码存储在 /etc/gshadow)
# 3. GID(组ID)
# 4. 组成员(用户列表,逗号分隔)
(2)/etc/gshadow:组密码信息

存储组密码及管理员信息(仅 root 可读写):

1
2
3
4
5
6
wheel:$6$xxxx:user1:user2,user3
# 字段含义:
# 1. 组名(wheel)
# 2. 加密组密码(空或 ! 表示无密码)
# 3. 组管理员(可管理组的用户)
# 4. 组成员

组管理核心命令

(1)创建组:groupadd
1
2
3
4
5
6
7
8
# 基本语法
groupadd [选项] 组名

# 示例 1:创建普通组
groupadd dev

# 示例 2:指定 GID 创建组
groupadd -g 1005 testgrp
(2)修改组:groupmod
1
2
3
4
5
6
7
8
# 基本语法
groupmod [选项] 组名

# 示例 1:修改组名
groupmod -n newdev dev # 将 dev 改名为 newdev

# 示例 2:修改组 GID
groupmod -g 1006 newdev
(3)删除组:groupdel
1
2
# 基本语法(删除前需确保组不是任何用户的初始组)
groupdel dev
(4)管理组成员:gpasswd
1
2
3
4
5
6
7
8
9
10
11
# 基本语法
gpasswd [选项] 组名

# 示例 1:添加用户到组(附加组)
gpasswd -a user1 dev # 将 user1 加入 dev 组

# 示例 2:从组中移除用户
gpasswd -d user1 dev

# 示例 3:设置组管理员
gpasswd -A user2 dev # user2 可管理 dev 组的成员
(5)切换有效组:newgrp

临时切换用户的有效组(用于创建文件时指定所属组):

1
newgrp dev  # 切换当前有效组为 dev(需输入组密码,无密码直接回车)

用户与组的关系

每个用户有且仅有一个初始组(创建用户时默认创建同名组,可通过 -g 指定),可以有多个附加组(通过 -Ggpasswd 添加)。

  • 初始组:用户创建文件时,文件的默认所属组为初始组。
  • 附加组:用户通过附加组获得额外权限(如 sudo 权限通常通过 wheel 组赋予)。

实战案例:用户与组管理流程

  1. 创建开发团队用户与组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 创建开发组 dev
    groupadd dev

    # 创建用户并加入 dev 组(初始组)
    useradd -g dev -m dev1
    useradd -g dev -m dev2

    # 设置密码
    passwd dev1
    passwd dev2

    # 创建测试组 test,并将 dev1 加入(附加组)
    groupadd test
    gpasswd -a dev1 test
  2. 配置 sudo 权限

    1
    2
    3
    visudo
    # 允许 dev1 执行管理员命令
    dev1 ALL=(ALL) ALL
  3. 查看用户所属组

    1
    id dev1  # 输出应包含 uid、gid=dev、groups=dev,test

欢迎关注我的其它发布渠道