Linux: Phase 2 Mini Project——配置多用户开发环境
Phase 2 的验收项目。你将综合运用用户管理、文件权限和环境变量知识,从一个"单用户混乱"的场景出发,搭建一个可供团队协作的多用户开发服务器。
📋 前置知识:需要先掌握以下内容
- 第8课:文件权限
- 第9课:用户与组管理
- 第10课:环境变量与 PATH
1. 你将学到
- 团队用户体系设计
- 共享目录权限策略
- umask 团队统一配置
- 各开发者独立 Shell 配置
- sudo 权限分组管理
2. 小明的团队协作噩梦
(1) 痛点:三人共享服务器,文件互相串
小明的三人开发团队共用一台云服务器。每个人都用 root 登录,文件权限没人管——小明的脚本被同事不小心删了三次,他找不到自己的文件了,因为被混在了 /tmp 里。
(2) 标准化多用户环境
Bob 帮他们设计了标准的多用户环境:
# 1. 每个人有自己的账号和家目录
sudo useradd -m -s /bin/bash alice
sudo useradd -m -s /bin/bash bob
sudo useradd -m -s /bin/bash charlie
# 2. 共享项目目录(SGID 保证组继承)
sudo mkdir -p /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project
(3) 收益:各人有各人的空间,共享区有秩序
文件不再丢失,每个人都有自己独立的家目录和 Shell 配置,共享目录设置了正确的权限——不会有人误删别人的文件。
3. 知识点讲解
(1) 多用户环境设计原则
| 原则 | 说明 |
|---|---|
| 最小权限 | 每个用户只拥有完成任务所需的最小权限 |
| 职责分离 | 不同角色使用不同用户,避免"一个 root 走天下" |
| 组策略 | 用组来管理权限集,而非单独为每个用户设置 |
| 审计追踪 | 使用 sudo 而非直接 root——所有命令有日志 |
(2) 共享目录权限策略
对于团队共享目录,推荐使用 SGID:新创建的文件自动继承目录的组。
# /srv/project 是共享目录
sudo chown root:developers /srv/project
sudo chmod 2775 /srv/project
# 2 = SGID(新文件继承组)
# 775 = 所有者(组)可读写执行,其他人只读执行
> ⚠️ **注意**:`chmod 2775` 中的 `2` 代表 SGID——在共享目录上设置 SGID 后,任何用户在此目录创建的新文件都会自动继承目录的组(而非创建者的主组),这是团队协作的关键机制。如果遗漏 SGID,新文件将属于创建者的主组,其他团队成员可能无法修改。
(3) /etc/skel——用户模板目录
/etc/skel/ 中的文件会在创建新用户时自动复制到其家目录。放入自己编写的默认配置:
# 查看默认的 skel 内容
ls -la /etc/skel/
# 为所有新用户添加自定义配置
sudo tee -a /etc/skel/.bashrc << 'EOF'
# ---- 团队标准配置 ----
alias ll='ls -la'
alias ..='cd ..'
export EDITOR=vim
EOF
▶ 示例:创建完整的团队用户体系
# 创建共享组
sudo groupadd developers
# 为三个开发者创建账号
for user in alice bob charlie; do
sudo useradd -m -s /bin/bash "$user"
sudo passwd "$user" # 交互设置密码
sudo usermod -aG developers "$user"
echo "用户 $user 创建完成"
done
# 验证
grep developers /etc/group
输出:
TEXT 📖 仅展示用户 alice 创建完成 用户 bob 创建完成 用户 charlie 创建完成 developers:x:1005:alice,bob,charlie
▶ 示例:配置 SGID 共享目录
# 创建共享项目目录
sudo mkdir -p /srv/project/{src,docs,scripts}
# 设置组
sudo chgrp -R developers /srv/project
# 设置 SGID + 标准权限
sudo chmod 2775 /srv/project
# 2 = SGID
# 7 = 所有者 (rwx)
# 7 = 组 (rwx)
# 5 = 其他人 (r-x)
# 测试:以不同用户创建文件,验证自动继承组
sudo -u alice touch /srv/project/test.txt
ls -l /srv/project/test.txt
# -rw-r--r-- 1 alice developers 0 Jul 7 12:00 test.txt
# 文件属于 developers 组 ✅
输出:
TEXT 📖 仅展示-rw-r--r-- 1 alice developers 0 Jul 7 12:00 test.txt
▶ 示例:配置默认 umask
# 为团队设置统一的 umask(这样共享文件默认是可写的)
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
# 002 的效果:
# 文件:666 - 002 = 664 (rw-rw-r--)
# 目录:777 - 002 = 775 (rwxrwxr-x)
# 这样组内成员可以互相修改文件
> ℹ️ **说明**:团队协作时,统一 umask 为 002 可以让组内成员互相修改文件。但要注意安全性——在多团队共用的服务器上,002 可能过于宽松。建议只在共享目录使用 SGID + 002,用户家目录仍保持默认的 022。
输出:
TEXT 📖 仅展示umask 002
▶ 示例:个性化 .bashrc 配置
# 小明喜欢彩色提示符
cat >> ~/.bashrc << 'EOF'
export PS1='\[\033[1;32m\]\u\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
alias ll='ls -lah'
EOF
source ~/.bashrc
# Bob 喜欢简洁
cat >> ~/.bashrc << 'EOF'
export PS1='\w\$ '
alias l='ls -CF'
EOF
source ~/.bashrc
输出:
TEXT 📖 仅展示alice:~/projects$ ls -lah drwxr-x--- 2 alice developers 4096 Jul 7 10:30 .
▶ 示例:sudo 权限分组管理
# 创建分组
sudo groupadd devops
# 将小明加入 devops 组(他可以管理系统服务)
sudo usermod -aG devops charlie
# 配置 sudo 权限按组分
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
echo '%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt' | sudo tee /etc/sudoers.d/devops
> 💡 **提示**:sudo 权限管理推荐"分组原则"——按角色创建组(如 developers、devops),然后在 `/etc/sudoers.d/` 下为每个组创建独立文件。这样增删用户只需修改组成员,不用反复编辑 sudoers 文件。
# 设置权限
sudo chmod 440 /etc/sudoers.d/*
输出:
TEXT 📖 仅展示%developers ALL=(ALL) ALL %devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt
▶ 综合示例:完整的多用户环境部署脚本
#!/bin/bash
# setup-multi-user.sh - 搭建多用户团队开发环境
set -e
echo "=== 开始配置多用户开发环境 ==="
# 1. 创建用户
TEAM_MEMBERS=("alice" "bob" "charlie")
sudo groupadd developers 2>/dev/null || true
for user in "${TEAM_MEMBERS[@]}"; do
if id "$user" &>/dev/null; then
echo "用户 $user 已存在,跳过创建"
else
sudo useradd -m -s /bin/bash "$user"
echo "请为 $user 设置密码:"
sudo passwd "$user"
fi
sudo usermod -aG developers "$user"
done
echo "✅ 用户创建完成"
# 2. 创建共享目录
sudo mkdir -p /srv/project/{src,docs,scripts,tests}
sudo chgrp -R developers /srv/project
sudo chmod 2775 /srv/project
sudo chmod 2775 /srv/project/*/
echo "✅ 共享目录创建完成(SGID 已设置)"
# 3. 配置团队 umask
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
echo "✅ 团队 umask 配置完成"
# 4. 配置 sudo 权限
echo '%developers ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/developers
sudo chmod 440 /etc/sudoers.d/developers
echo "✅ sudo 权限配置完成"
# 5. 创建 README
cat | sudo tee /srv/project/README.md << 'EOF'
# 团队项目目录
---
## 4. 目录结构
- src/ — 源代码
- docs/ — 文档
- scripts/ — 脚本
- tests/ — 测试
---
## 5. 规则
- umask 002,组内文件可互相修改
- 不要用 root 操作此目录
- 用 `sudo` 安装软件前先确认
EOF
echo "✅ README 创建完成"
echo ""
echo "=== 环境就绪 ==="
echo "用户列表: ${TEAM_MEMBERS[*]}"
echo "共享目录: /srv/project"
echo ""
echo "验证方式:"
echo " 1. 用不同用户创建文件,检查组是否为 developers"
echo " 2. 用 who 查看在线用户"
echo " 3. 用 sudo -l 查看权限"
❓ 常见问题
Q: 为什么共享目录要设置 SGID? A: SGID 保证用户在共享目录中创建的任何文件/子目录都自动继承父目录的组。如果没有 SGID,小明创建的文件会属于小明的私有组,其他组员没权限修改。加上 SGID,文件自动属于
developers组。
Q:
/etc/skel目录有什么作用? A: 当用useradd -m创建新用户时,/etc/skel/中的全部文件会自动复制到新用户的家目录。你可以把默认的.bashrc、.profile、.vimrc等模板放在这里。
Q: umask 设成 007 会怎样? A: umask 007 表示新文件和目录不给"其他人"任何权限。文件:666-007=660(rw-rw----),目录:777-007=770(rwxrwx---)。适合团队成员独占的服务器。
Q: 用户家目录的权限应该是多少? A: 标准是 755(
rwxr-xr-x)——所有者完全控制,其他人只能读和执行(可以 cd 进入但不能写)。如果需要保护隐私,设置为 750 或 700。
Q: 怎么限制某个用户的 sudo 权限? A: 在
/etc/sudoers.d/下创建独立文件,精确指定允许的命令:alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt。这样该用户只能用 sudo 执行 systemctl 和 apt,不能做其他操作。
📖 小节
- team 用户体系:每人独立账号 + 共享 developers 组
- SGID(
chmod g+s或数字2xxx)让共享目录新文件自动继承组 - umask 002 适合团队协作(组内可写)
/etc/skel设置新用户默认配置模板- sudo 权限分组管理:不同组不同权限级别
📝 作业
- 基础题(难度⭐):创建两个用户
dev1和dev2,加入team组,然后创建共享目录/srv/team-project并设置 SGID(2775) - 进阶题(难度⭐⭐):分别以
dev1和dev2在共享目录中创建文件,验证文件自动属于team组,然后配置dev1只能sudo apt和sudo systemctl(限制命令) - 挑战题(难度⭐⭐⭐):写一个脚本,一键完成以上全部配置(创建用户、组、目录、SGID、sudo 限制),要求加入参数检查和错误处理