Linux用户和组管理实验
任务一:创建项目资源目录
在你的 home 目录下创建一个名为 project_szpu 的目录,并在该目录下创建以下子目录和文件:
project_szpu/
├── code
│ └── main.java
└── doc└── version.txt
使用 tree 命令查看目录结构,截图。
cd ~ && \
mkdir -p project_szpu/{code,doc} && \
touch project_szpu/code/main.java project_szpu/doc/version.txt && \
tree project_szpu

任务二:创建成员用户
创建4个成员用户,用户名分别为 user1、user2、user3、user4,每个用户的主用户组与用户名相同(如 user1 的主用户组为 user1)。
- 每个成员的密码与用户名相同;
- 用户的主目录在
home目录下并与用户名同名; shell设置为/bin/bash。
查询 home 目录,确认每个用户的目录已创建。 切换到 user1 用户,进入其主目录,截图。
创建用户
# 创建4个用户(useradd会自动创建同名的主用户组、home目录,并设置shell为/bin/bash)
sudo useradd -m -s /bin/bash user1
sudo useradd -m -s /bin/bash user2
sudo useradd -m -s /bin/bash user3
sudo useradd -m -s /bin/bash user4# 为每个用户设置密码(密码与用户名相同)
echo "user1:user1" | sudo chpasswd
echo "user2:user2" | sudo chpasswd
echo "user3:user3" | sudo chpasswd
echo "user4:user4" | sudo chpasswd
| -m : 创建用户的home目录 |
|---|
| -s /bin/bash : 设置shell为/bin/bash |
| chpasswd : 批量修改用户密码 |
验证用户创建情况
# 查看/etc/passwd文件确认用户已创建
grep "user[1-4]" /etc/passwd# 查看home目录,确认用户目录已创建
ls -ld /home/user*# 查看用户的详细信息
id user1
id user2
id user3
id user4

切换到user1用户
# 切换到user1用户
su - user1# 确认当前用户
whoami# 查看当前所在目录
pwd# 列出当前目录内容
ls -la

任务三:创建新组并修改附加组
- 创建一个新的组
group1。 - 使用
gpasswd命令将4个成员用户的附加组设置为group1。【提示:这儿需要使用gpasswd而不是usermod】 - 将
main.java和version.txt的所属组修改成group1
创建新组 group1
# 创建组group1
sudo groupadd group1# 验证组是否创建成功
grep group1 /etc/group

使用 gpasswd 将4个用户添加到 group1 附加组
# 使用gpasswd命令将用户添加到group1附加组
sudo gpasswd -a user1 group1
sudo gpasswd -a user2 group1
sudo gpasswd -a user3 group1
sudo gpasswd -a user4 group1# 验证用户的组信息
id user1
id user2
id user3
id user4# 查看group1的成员
grep group1 /etc/group

| -a : 将用户添加到组(add user to group) |
|---|
| -d : 从组中删除用户(delete user from group) |
| -M : 设置组成员列表 |
修改文件的所属组
# 修改main.java的所属组为group1
sudo chgrp group1 ~/project_szpu/code/main.java# 修改version.txt的所属组为group1
sudo chgrp group1 ~/project_szpu/doc/version.txt# 验证文件的所属组
ls -l ~/project_szpu/code/main.java
ls -l ~/project_szpu/doc/version.txt# 或者查看整个目录结构的权限信息
ls -lR ~/project_szpu/

任务四:设置文件权限
在上述基础上,完成 project_szpu 目录下的文件和目录设置权限:
- 项目经理对
main.java和version.txt文件具有读、写、执行权限。 - 项目成员对
main.java文件只有读、执行权限,对version.txt文件只有读权限。 - 其他用户禁止对这些文件有任何读、写、执行权限。
查看 main.java 以及 version.txt 属性,截图
设置文件权限
# 确保文件的所有者是项目经理(当前用户),所属组是group1
# 先修改所有者和所属组
sudo chown $(whoami):group1 ~/project_szpu/code/main.java
sudo chown $(whoami):group1 ~/project_szpu/doc/version.txt# 设置main.java的权限
# 所有者(项目经理): 读写执行 (rwx = 7)
# 组成员(项目成员): 读执行 (r-x = 5)
# 其他用户: 无权限 (--- = 0)
chmod 750 ~/project_szpu/code/main.java# 设置version.txt的权限
# 所有者(项目经理): 读写执行 (rwx = 7)
# 组成员(项目成员): 只读 (r-- = 4)
# 其他用户: 无权限 (--- = 0)
chmod 740 ~/project_szpu/doc/version.txt# 查看文件权限
ls -l ~/project_szpu/code/main.java
ls -l ~/project_szpu/doc/version.txt# 使用stat命令查看详细信息
stat ~/project_szpu/code/main.java
stat ~/project_szpu/doc/version.txt

任务五:修改用户密码
更改 user1 的密码为 tjxs。
# 修改user1的密码为tjxs
echo "user1:tjxs" | sudo chpasswd# 或者使用passwd命令交互式修改
sudo passwd user1
# 然后输入新密码: tjxs
# 再次确认密码: tjxs# 验证密码修改(尝试切换用户)
su - user1
# 输入密码: tjxs
# 成功登录后执行 exit 退出

任务六:锁定用户
锁定 user2 用户,并查看 /etc/shadow 文件。 在文件中找到 user2 对应的行并截图提交。
# 锁定user2用户
sudo usermod -L user2
# 或者使用
sudo passwd -l user2# 查看/etc/shadow文件中user2的行
sudo grep user2 /etc/shadow# 查看锁定状态(密码字段前会有!或!!标记)
sudo cat /etc/shadow | grep user2# 验证用户是否被锁定
sudo passwd -S user2

任务七:思考题
- 整理所有的脚本,并提交。
tee ~/user_group_lab.sh > /dev/null <<'EOF'
#!/bin/bashecho "=========================================="
echo " Linux用户和组管理实验 - 完整脚本"
echo "=========================================="# ============ 任务一:创建目录结构 ============
echo -e "\n【任务一】创建目录结构"
cd ~
mkdir -p project_szpu/{code,doc}
touch project_szpu/code/main.java
touch project_szpu/doc/version.txt
echo "✓ 目录结构创建完成"
tree project_szpu 2>/dev/null || ls -R project_szpu# ============ 任务二:创建用户 ============
echo -e "\n【任务二】创建4个成员用户"
for i in {1..4}; dosudo useradd -m -s /bin/bash user$iecho "user$i:user$i" | sudo chpasswdecho "✓ 用户 user$i 创建成功"
doneecho -e "\n查看用户信息:"
grep "user[1-4]" /etc/passwdecho -e "\n查看home目录:"
ls -ld /home/user*echo -e "\n查看用户详细信息:"
for i in {1..4}; doid user$i
done# ============ 任务三:创建组并设置附加组 ============
echo -e "\n【任务三】创建新组并修改附加组"
sudo groupadd group1
echo "✓ 组group1创建成功"echo -e "\n将用户添加到group1附加组:"
for i in {1..4}; dosudo gpasswd -a user$i group1
doneecho -e "\n查看group1的所有成员:"
grep group1 /etc/groupecho -e "\n验证用户组信息:"
for i in {1..4}; doecho "user$i: $(groups user$i)"
doneecho -e "\n修改文件所属组为group1:"
sudo chgrp group1 ~/project_szpu/code/main.java
sudo chgrp group1 ~/project_szpu/doc/version.txt
echo "✓ 文件所属组修改完成"echo -e "\n查看文件属性:"
ls -l ~/project_szpu/code/main.java
ls -l ~/project_szpu/doc/version.txt# ============ 任务四:设置文件权限 ============
echo -e "\n【任务四】设置文件权限"
sudo chown $(whoami):group1 ~/project_szpu/code/main.java
sudo chown $(whoami):group1 ~/project_szpu/doc/version.txt# main.java: 项目经理rwx, 项目成员r-x, 其他---
chmod 750 ~/project_szpu/code/main.java
echo "✓ main.java权限设置为750 (rwxr-x---)"# version.txt: 项目经理rwx, 项目成员r--, 其他---
chmod 740 ~/project_szpu/doc/version.txt
echo "✓ version.txt权限设置为740 (rwxr-----)"echo -e "\n查看文件权限:"
ls -l ~/project_szpu/code/main.java
ls -l ~/project_szpu/doc/version.txtecho -e "\n完整目录结构和权限:"
ls -lR ~/project_szpu/# ============ 任务五:修改用户密码 ============
echo -e "\n【任务五】修改用户密码"
echo "user1:tjxs" | sudo chpasswd
echo "✓ user1密码已修改为tjxs"# ============ 任务六:锁定用户 ============
echo -e "\n【任务六】锁定用户"
sudo usermod -L user2
echo "✓ user2用户已锁定"echo -e "\n查看user2在/etc/shadow中的状态:"
sudo grep user2 /etc/shadowecho -e "\n查看user2锁定状态:"
sudo passwd -S user2# ============ 实验总结 ============
echo -e "\n=========================================="
echo " 实验完成总结"
echo "=========================================="
echo "✓ 已创建目录结构: project_szpu"
echo "✓ 已创建4个用户: user1, user2, user3, user4"
echo "✓ 已创建组: group1"
echo "✓ 已将4个用户添加到group1附加组"
echo "✓ 已设置文件所属组和权限"
echo "✓ 已修改user1密码"
echo "✓ 已锁定user2用户"
echo "=========================================="# ============ 验证脚本 ============
echo -e "\n是否需要运行权限验证测试? (y/n)"
read -t 10 answer || answer="n"if [ "$answer" = "y" ]; thenecho -e "\n【权限验证测试】"echo -e "\n测试user1读取main.java:"sudo -u user1 cat ~/project_szpu/code/main.java 2>&1 && echo "✓ 成功" || echo "✗ 失败"echo -e "\n测试user1写入main.java(应该失败):"sudo -u user1 bash -c "echo 'test' >> ~/project_szpu/code/main.java" 2>&1 && echo "✗ 不应成功" || echo "✓ 正确阻止"echo -e "\n测试user1读取version.txt:"sudo -u user1 cat ~/project_szpu/doc/version.txt 2>&1 && echo "✓ 成功" || echo "✗ 失败"echo -e "\n测试user2登录(应该失败,因为已锁定):"echo "tjxs" | su - user2 2>&1 | head -n 1
fiecho -e "\n实验脚本执行完毕!"
EOF
# 赋予可执行权限
chmod +x ~/user_group_lab.sh
- 为什么在修改用户的附加组时使用
gpasswd而不是usermod?这两个命令有什么区别?
虽然两个命令都可以管理用户组,但它们有重要区别:
gpasswd 命令:专门用于组管理
-a 参数:添加用户到附加组(不影响其他附加组)
-d 参数:从组中删除用户
操作是增量式的,不会覆盖用户现有的其他附加组
更安全,适合逐个添加组成员usermod 命令:用于修改用户账户信息
-G 参数:设置用户的附加组列表(会覆盖所有现有附加组)
-aG 参数:追加附加组(不覆盖)
如果只用 -G,会替换用户的所有附加组,可能导致用户失去其他重要组的权限
- 实验中将文件的所属组修改成
group1的目的是什么?
修改文件所属组为 group1 是实现团队协作的核心步骤,
让项目成员通过组成员身份获得相应权限,
而不是依赖"其他用户"权限(那样会不安全)。