Linux运维实践(3) 用户和权限管理实战

今日学习目标

  • ✅ 理解Linux用户和组的概念
  • ✅ 掌握用户/组的增删改查
  • ✅ 彻底搞懂文件权限(rwx)
  • ✅ 学会使用sudo提升权限

第一部分:用户管理基础

1. 了解用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cd ~/linux-learning/day3
mkdir user-management
cd user-management

# 查看当前用户
whoami # 我是谁
id # 查看用户ID、组ID信息
who # 谁登录了系统
w # 更详细的登录信息

# 查看所有用户
cat /etc/passwd | head -5 # 前5个用户
# 格式:用户名:密码:x:UID:GID:描述:家目录:shell

cat /etc/shadow | head -5 # 查看密码信息(需要root)
# 格式:用户名:加密密码:上次修改:最小天数:最大天数:警告:失效:过期:保留

# 查看所有组
cat /etc/group | head -5 # 前5个组

2. 创建用户和组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 切换到root(或者使用sudo)
su - root

# 创建组
groupadd developers # 创建开发组
groupadd devops # 创建运维组
groupadd testers # 创建测试组

# 查看创建的组
tail -3 /etc/group

# 创建用户
useradd john # 创建用户john(默认创建同名组)
useradd -m jane # -m 确保创建家目录
useradd -d /home/tom -m tom # 指定家目录
useradd -g developers mike # 指定主组为developers
useradd -G devops,testers lisa # 指定附加组

# 设置密码
passwd john # 设置john的密码(输入两次)
echo "123456" | passwd --stdin jane # 非交互式设置密码

# 查看用户信息
id john
id jane
id mike
id lisa

# 查看用户的家目录
ls -la /home/

3. 用户信息管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 修改用户信息
usermod -l john_new john # 修改用户名(john -> john_new)
usermod -d /home/newhome -m john_new # 修改家目录并移动文件
usermod -g testers john_new # 修改主组
usermod -G devops,developers john_new # 修改附加组

# 锁定和解锁用户
passwd -l john_new # 锁定用户(不能登录)
passwd -u john_new # 解锁用户

# 查看用户状态
passwd -S john_new # 查看密码状态

# 删除用户
userdel john_new # 删除用户但保留家目录
userdel -r jane # 删除用户及其家目录

第二部分:实战演练 - 创建项目团队

现在我们来模拟一个真实场景:为一个项目团队创建用户环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 创建项目团队环境
cd ~/linux-learning/day3/user-management

# 创建项目组
groupadd project_alpha
groupadd project_beta

# 创建项目经理、开发人员、测试人员
# 项目经理
useradd -m -G project_alpha pm_wang
echo "pm@123" | passwd --stdin pm_wang

# 开发团队
for i in {01..03}; do
useradd -m -G project_alpha,project_beta dev_zhang$i
echo "dev@123" | passwd --stdin dev_zhang$i
done

# 测试团队
for i in {01..02}; do
useradd -m -G project_beta tester_li$i
echo "test@123" | passwd --stdin tester_li$i
done

# 创建项目目录
mkdir -p /projects/{alpha,beta,shared}
mkdir -p /projects/alpha/{src,doc,bin,logs}
mkdir -p /projects/beta/{src,doc,bin,logs}

# 设置目录权限(稍后会详细讲解)
chown -R pm_wang:project_alpha /projects/alpha
chown -R pm_wang:project_beta /projects/beta
chmod 770 /projects/alpha
chmod 770 /projects/beta

# 查看创建结果
echo "=== 项目组成员 ==="
getent group project_alpha
getent group project_beta
echo "=== 项目目录 ==="
ls -la /projects/

第三部分:文件权限深度解析

1. 理解权限表示法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建一个练习文件
touch permissions.txt
echo "Permission Practice" > permissions.txt
mkdir permissions_dir

# 查看权限
ls -l permissions.txt
# 输出:-rw-rw-r-- 1 user group 20 Mar 12 10:00 permissions.txt
# ^^^^^^^^^^^
# 文件类型 + 权限

# 权限位解析
# 第1位:文件类型(-普通文件 d目录 l链接)
# 第2-4位:所有者权限(rwx)
# 第5-7位:所属组权限(rwx)
# 第8-10位:其他用户权限(rwx)

# 权限数字表示法(重要!)
# r = 4, w = 2, x = 1
# rw- = 4+2+0 = 6
# r-x = 4+0+1 = 5
# r-- = 4+0+0 = 4
# --- = 0
# rwx = 4+2+1 = 7

2. chmod - 修改权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 符号方式修改权限
touch test{1..5}.txt

chmod u+x test1.txt # 给所有者加执行权限
chmod g-w test2.txt # 给所属组去掉写权限
chmod o=r test3.txt # 其他人设为只读
chmod a+rw test4.txt # 所有人添加读写权限
chmod u=rwx,g=rx,o=r test5.txt # 分别设置

# 数字方式修改权限(最常用)
chmod 755 test1.txt # rwxr-xr-x
chmod 644 test2.txt # rw-r--r--
chmod 700 test3.txt # rwx------
chmod 777 test4.txt # rwxrwxrwx(危险!)

# 递归修改目录权限
mkdir -p dir1/dir2/dir3
touch dir1/dir2/file.txt
chmod -R 755 dir1/ # 递归修改目录下所有文件

# 练习:猜猜这些权限的含义
chmod 755 file # 答案:rwxr-xr-x
chmod 644 file # 答案:rw-r--r--
chmod 750 file # 答案:rwxr-x---
chmod 600 file # 答案:rw-------

3. chown/chgrp - 修改所有者和组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建练习文件
touch ownership.txt
mkdir ownership_dir

# 修改所有者
chown john ownership.txt # 改为john所有
chown john:developers ownership.txt # 同时修改所有者和组

# 修改所属组
chgrp developers ownership.txt # 只修改组

# 递归修改
chown -R john:developers ownership_dir/

# 实战:设置共享目录
mkdir shared_folder
chmod 770 shared_folder # 所有者和组有完全权限
chgrp developers shared_folder # 组改为developers
# 现在所有developers组的成员都可以读写这个目录

第四部分:特殊权限和sudo

1. 特殊权限(SUID、SGID、Sticky Bit)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# SUID (4) - 以文件所有者身份执行
chmod u+s /usr/bin/passwd # passwd命令有SUID权限
ls -l /usr/bin/passwd # 可以看到rwsr-xr-x

# SGID (2) - 以文件所属组身份执行,或目录中新建文件继承组
chmod g+s shared_folder # 目录设置SGID
ls -ld shared_folder # 看到drwxrws---

# Sticky Bit (1) - 只有文件所有者才能删除
chmod +t /tmp # /tmp目录有Sticky Bit
ls -ld /tmp # 看到drwxrwxrwt

# 数字方式设置
chmod 4755 file # SUID + rwxr-xr-x
chmod 2755 dir # SGID + rwxr-xr-x
chmod 1777 dir # Sticky + rwxrwxrwx

2. sudo权限配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看当前用户sudo权限
sudo -l

# 配置sudo(需要root)
visudo # 或 vim /etc/sudoers

# sudoers文件常用配置
# 允许用户执行所有命令
john ALL=(ALL) ALL

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

# 允许用户执行特定命令,不需要密码
jane ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/dnf

# 允许用户以特定用户身份执行命令
mike ALL=(webuser) /usr/bin/php

# 实战练习:给自己配置sudo权限
echo "你的用户名 ALL=(ALL) ALL" >> /etc/sudoers.d/yourname
# 然后测试:sudo whoami # 应该输出root

第五部分:综合实战 - 企业权限模型设计

现在我们来做一个企业级的权限设计项目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
cd ~/linux-learning/day3
mkdir enterprise-permissions
cd enterprise-permissions

# 场景:某公司有开发、运维、测试三个部门,共享一台服务器
# 需要实现:
# 1. 各部门有自己的工作目录
# 2. 有公共共享目录
# 3. 日志目录运维组可写,其他人只读
# 4. 发布目录只有运维组可写

cat > setup_enterprise_permissions.sh << 'EOF'
#!/bin/bash
# 企业服务器权限配置脚本

# 创建组
groupadd dev_team
groupadd ops_team
groupadd qa_team

# 创建用户并分配到组
# 开发部
for i in dev_{wang,li,zhang}; do
useradd -m -G dev_team $i
echo "dev@123" | passwd --stdin $i
done

# 运维部
for i in ops_{zhao,qian,sun}; do
useradd -m -G ops_team $i
echo "ops@123" | passwd --stdin $i
done

# 测试部
for i in qa_{zhou,wu,zheng}; do
useradd -m -G qa_team $i
echo "qa@123" | passwd --stdin $i
done

# 创建目录结构
mkdir -p /company/{dev,ops,qa,shared,logs,releases}

# 开发目录 - 开发组读写,其他组只读
chown -R root:dev_team /company/dev
chmod -R 750 /company/dev

# 运维目录 - 运维组完全控制
chown -R root:ops_team /company/ops
chmod -R 770 /company/ops

# 测试目录 - 测试组读写
chown -R root:qa_team /company/qa
chmod -R 750 /company/qa

# 共享目录 - 所有人都可读,但只有各自文件所有者可删
chown root:dev_team /company/shared
chmod 1777 /company/shared # 1777 = rwxrwxrwt

# 日志目录 - 运维组可写,其他人只读
chown root:ops_team /company/logs
chmod 750 /company/logs

# 发布目录 - 只有运维组可写,开发组可读
chown root:ops_team /company/releases
chmod 750 /company/releases

# 设置SGID,使新文件继承组
chmod g+s /company/dev
chmod g+s /company/ops
chmod g+s /company/qa
chmod g+s /company/releases

echo "=== 权限配置完成 ==="
echo "目录权限检查:"
ls -la /company/
EOF

chmod +x setup_enterprise_permissions.sh
# 需要用root执行
sudo ./setup_enterprise_permissions.sh

第六部分:今日挑战任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 挑战1:权限猜谜
# 解释以下权限的含义
-rwsr-xr-x 1 root root # 这是什么权限?
drwxrws--- 2 dev team # 这是什么目录?
-rw-r--r-- 1 user users # 普通文件的默认权限?

# 挑战2:创建特殊权限文件
# 创建一个文件,要求:
# 1. 所有者可读写执行
# 2. 所属组可读执行
# 3. 其他用户没有任何权限
# 4. 设置SUID

# 答案(尝试自己写):
touch challenge2
chmod 4750 challenge2 # 或 chmod u+s,g+rx,o-rwx challenge2

# 挑战3:用户批量管理脚本
# 编写脚本,从文件中读取用户名并批量创建
cat > users.txt << 'EOF'
alice:developers:alice@123
bob:ops:bob@123
charlie:qa:charlie@123
EOF

# 创建批量用户脚本
cat > batch_create_users.sh << 'EOF'
#!/bin/bash
# 批量创建用户脚本

INPUT_FILE="users.txt"
LOG_FILE="user_creation.log"

echo "开始创建用户: $(date)" > $LOG_FILE

while IFS=: read -r username group password; do # 内部字段分隔符设为冒号 :
echo "正在创建用户: $username"

# 检查组是否存在
if ! grep -q "^$group:" /etc/group; then
groupadd $group
echo " 创建组: $group" >> $LOG_FILE
fi

# 创建用户
useradd -m -G $group $username
echo "$password" | passwd --stdin $username

if [ $? -eq 0 ]; then # 如果上一条命令的退出状态码等于0(成功)
echo " ✅ 用户 $username 创建成功" >> $LOG_FILE # 记录成功日志
else # 否则(上一条命令失败)
echo " ❌ 用户 $username 创建失败" >> $LOG_FILE # 记录失败日志
fi # 结束 if 语句
done < $INPUT_FILE # 将文件内容重定向为循环的输入

echo "用户创建完成: $(date)" >> $LOG_FILE
echo "查看日志: $LOG_FILE"
EOF

chmod +x batch_create_users.sh
./batch_create_users.sh

常用的整数比较运算符

运算符 含义 英文 示例
-eq 等于 equal [ $a -eq $b ]
-ne 不等于 not equal [ $a -ne $b ]
-gt 大于 greater than [ $a -gt $b ]
-lt 小于 less than [ $a -lt $b ]
-ge 大于等于 greater or equal [ $a -ge $b ]
-le 小于等于 less or equal [ $a -le $b ]

第七部分:今日总结和面试题

重要知识点回顾:

  • ✅ 用户管理:useradd, usermod, userdel, passwd
  • ✅ 组管理:groupadd, groupmod, groupdel
  • ✅ 权限管理:chmod, chown, chgrp
  • ✅ 特殊权限:SUID(4), SGID(2), Sticky(1)
  • ✅ sudo配置:/etc/sudoers

面试必考题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 如何让普通用户执行root权限的命令?
答:配置sudo,如 "username ALL=(ALL) ALL"

# 2. rwx对文件和目录的区别?
答:文件:r读内容,w修改内容,x执行
目录:r列文件名,w创建删除文件,x进入目录

# 3. 如何让多个用户共同管理一个目录?
答:创建共同组,chown -R root:group /dir,chmod 770 /dir

# 4. SUID和SGID的作用?
答:SUID: 执行时以文件所有者身份运行
SGID: 目录中新文件继承目录的组

# 5. 如何限制用户只能执行特定命令?
答:在sudoers中配置,如 "user ALL=(ALL) /usr/bin/systemctl"

今日名言:”权限是Linux安全的基石,理解权限就是理解Linux的安全模型。”