Skip to content

Latest commit

 

History

History
599 lines (441 loc) · 11.8 KB

File metadata and controls

599 lines (441 loc) · 11.8 KB

UNIX 文件权限模拟器 - 用户手册

📖 目录

  1. 系统概述
  2. 功能特性
  3. 快速开始
  4. 命令参考
  5. 权限模型说明
  6. 使用示例
  7. 常见问题

系统概述

UNIX 文件权限模拟器是一个教学工具,用于模拟 UNIX/Linux 文件系统的权限控制机制。它提供了一个交互式命令行界面(Shell),让用户可以体验真实的文件权限管理。

主要特点

  • 📁 真实的文件系统层次结构
  • 👥 多用户和用户组管理
  • 🔒 完整的读/写/执行权限控制
  • 🛠️ 18个常用 UNIX 命令
  • 🎓 适合学习和实验

功能特性

文件系统功能

  • ✅ 创建和删除文件和目录
  • ✅ 移动和重命名文件
  • ✅ 复制文件
  • ✅ 递归删除非空目录
  • ✅ 支持绝对路径和相对路径
  • ✅ 支持相对路径快捷方式(./file, ../file)
  • ✅ 路径规范化(. 和 ..)
  • ✅ 完整的输入验证和安全检查

权限管理

  • ✅ 读(r)、写(w)、执行(x)权限
  • ✅ 所有者、用户组、其他用户权限分类
  • ✅ 使用 chmod 修改权限
  • ✅ 使用 chown 修改所有者
  • ✅ Root 超级用户权限

用户管理

  • ✅ 创建和删除用户(useradd, userdel)
  • ✅ 创建用户组(groupadd)
  • ✅ 添加用户到用户组(groupmod)
  • ✅ 用户组权限控制
  • ✅ 切换用户(su)

快速开始

启动程序

  1. 编译项目(如果需要)
  2. 运行 DemoProject.exe
  3. 选择模式:
    • 输入 1 - 运行所有测试
    • 输入 2 - 进入交互式Shell

Shell 界面

进入 Shell 后,你会看到提示符:

[root@/]$

格式: [用户名@当前路径]$


命令参考

用户管理命令

useradd <username>

创建新用户

[root@/]$ useradd alice
用户创建成功: alice (UID=1, GID=1)

注意: 只有 root 可以创建用户

userdel <uid>

删除用户

[root@/]$ userdel 1
用户删除成功: UID=1

groupadd <groupname>

创建用户组

[root@/]$ groupadd developers
组创建成功: developers (GID=3)

注意: 只有 root 可以创建用户组

groupmod <gid> <uid>

添加用户到用户组

[root@/]$ groupmod 3 1
成功将 UID=1 添加到 GID=3

注意: 只有 root 可以修改用户组成员

su <uid>

切换当前用户

[root@/]$ su 1
[alice@/]$ whoami
alice (UID=1)

whoami

显示当前用户信息

[root@/]$ whoami
root (UID=0)

文件操作命令

ls [path]

列出目录内容

[root@/]$ ls /home
drwxr-xr-x uid=0 user1/
-rw-r--r-- uid=0 readme.txt

输出格式:

  • 第一个字符: d(目录) 或 -(文件)
  • 接下来9个字符: 权限(rwxr-xr-x格式)
  • uid=: 所有者ID
  • 文件名

mkdir <path>

创建目录

支持路径格式:

  • 绝对路径: mkdir /home/test
  • 相对路径: mkdir test, mkdir ./test, mkdir ../test
[root@/]$ mkdir /home/test
[root@/]$ cd /home
[root@/home]$ mkdir ./subdir
[root@/home]$ ls
drwxr-xr-x uid=0 test/
drwxr-xr-x uid=0 subdir/

touch <path>

创建空文件

支持路径格式:

  • 绝对路径: touch /home/file.txt
  • 相对路径: touch file.txt, touch ./file.txt
[root@/]$ touch /home/file.txt
[root@/home]$ touch ./newfile.txt
[root@/home]$ ls
-rw-r--r-- uid=0 file.txt
-rw-r--r-- uid=0 newfile.txt

rm <path>

删除文件或空目录

[root@/]$ rm /home/file.txt

rm -r <path>

递归删除目录(包含内容)

[root@/]$ rm -r /home/testdir

mv <src> <dest>

移动或重命名文件

# 重命名
[root@/]$ mv /home/old.txt /home/new.txt

# 移动到目录
[root@/]$ mv /home/file.txt /home/user1/

# 移动并重命名
[root@/]$ mv /home/file.txt /home/user1/newfile.txt

cp <src> <dest>

复制文件

# 复制到目录
[root@/]$ cp /home/file.txt /home/user1/

# 复制并重命名
[root@/]$ cp /home/file.txt /home/user1/copy.txt

权限管理命令

chmod <path> <perms>

修改文件权限

格式1: 八进制格式

[root@/]$ chmod /home/file.txt 755
  • 7 = rwx (读+写+执行)
  • 5 = r-x (读+执行)
  • 5 = r-x (读+执行)

格式2: 符号格式

[root@/]$ chmod /home/file.txt rwxr-xr-x

权限对照表:

数字 二进制 权限
0 000 --- (无权限)
1 001 --x (执行)
2 010 -w- (写)
3 011 -wx (写+执行)
4 100 r-- (读)
5 101 r-x (读+执行)
6 110 rw- (读+写)
7 111 rwx (读+写+执行)

chown <path> <uid> [gid]

修改文件所有者

[root@/]$ chown /home/file.txt 1
修改所有者成功: UID=1

[root@/]$ chown /home/file.txt 1 3
修改所有者成功: UID=1, GID=3

参数说明:

  • uid - 新的用户ID (必需)
  • gid - 新的组ID (可选,如果不指定则不修改组)

注意: 只有 root 可以修改文件所有者


导航命令

cd <path>

切换当前目录

[root@/]$ cd /home
[root@/home]$ cd user1
[root@/home/user1]$ cd ..
[root@/home]$ cd /
[root@/]$

支持:

  • 绝对路径: cd /home/user
  • 相对路径: cd user1
  • 父目录: cd ..
  • 当前目录: cd .

pwd

显示当前工作目录

[root@/home/user1]$ pwd
/home/user1

其他命令

help

显示命令帮助

[root@/]$ help

显示所有可用命令及格式

exit

退出 Shell

[root@/]$ exit

再见!

权限模型说明

权限分类

每个文件有3类权限,每类3个bit:

类型 | 所有者 | 用户组 | 其他用户
-----|--------|--------|--------
  d  |  rwx   |  r-x   |  r--
     |  111   |  101   |  100
     |   7    |   5    |   4

权限类型

权限 字符 说明 文件 目录
读 r Read 查看文件内容 列出目录内容
写 w Write 修改文件内容 创建/删除文件
执行 x Execute 执行程序 进入目录(cd)

权限检查规则

  1. Root 用户: UID=0,拥有所有权限
  2. 文件所有者: 检查所有者权限(owner_perms)
  3. 同组用户: 检查用户组权限(group_perms)
  4. 其他用户: 检查其他用户权限(other_perms)

默认权限

  • 目录创建: 755 (rwxr-xr-x)
  • 文件创建: 644 (rw-r--r--)

使用示例

场景1: 创建个人项目

# 1. 创建项目目录
[root@/]$ mkdir /project
[root@/]$ mkdir /project/src
[root@/]$ mkdir /project/docs

# 2. 创建项目文件
[root@/]$ touch /project/src/main.c
[root@/]$ touch /project/docs/readme.md

# 3. 设置权限
[root@/]$ chmod /project/src 755
[root@/]$ chmod /project/docs 755
[root@/]$ chmod /project/src/main.c 644

# 4. 查看结果
[root@/]$ ls /project
drwxr-xr-x uid=0 src/
drwxr-xr-x uid=0 docs/

场景2: 多用户协作

# 1. 创建用户和组
[root@/]$ useradd alice
用户创建成功: alice (UID=1, GID=1)

[root@/]$ useradd bob
用户创建成功: bob (UID=2, GID=2)

[root@/]$ groupadd developers
组创建成功: developers (GID=10)

# 2. 添加用户到组
[root@/]$ cd /project
[root@/project]$ touch shared.txt

# 3. 修改所有者和权限
[root@/project]$ chown /project/shared.txt 1 10
[root@/project]$ chmod /project/shared.txt 664
# 664 = rw-rw-r--
# alice(UID=1,GID=10) 和 组成员可读写,其他用户只读

# 4. 测试权限
[root@/project]$ su 1
[alice@/project]$ # alice可以读写

[root@/project]$ su 2
[bob@/project]$ # bob可以读写(同组)

场景3: 权限实验

# 创建测试文件
[root@/]$ touch /test.txt
[root@/]$ chmod /test.txt 000

# 测试root权限
[root@/]$ rm /test.txt
# 成功! root始终可以访问

# 创建测试文件
[root@/]$ touch /public.txt
[root@/]$ chmod /public.txt 644
# 644 = rw-r--r-- (所有人可读)

# 普通用户测试
[root@/]$ su 1
[alice@/]$ rm /public.txt
rm: 权限不足
# alice不是所有者,只有读权限,无法删除

常见问题

Q1: 为什么我无法删除文件?

A: 检查以下几点:

  1. 你是否是文件所有者?
  2. 你是否有父目录的写权限?
  3. 使用 ls 查看文件权限
[alice@/]$ ls /home/file.txt
-rw-r--r-- uid=0 file.txt

这个文件所有者是root(uid=0),alice无法删除。

Q2: 什么是 Root 用户?

A: Root 是超级用户,UID=0,拥有系统所有权限。Root 可以:

  • 访问任何文件(无论权限如何)
  • 修改任何文件的权限和所有者
  • 删除任何文件
  • 创建和管理其他用户

Q3: 权限数字怎么计算?

A: 使用二进制转十进制:

rwx = 111 (二进制) = 7 (十进制)
r-x = 101 (二进制) = 5 (十进制)
rw- = 110 (二进制) = 6 (十进制)
r-- = 100 (二进制) = 4 (十进制)

常用权限:

  • 777 = rwxrwxrwx (所有人可读写执行)
  • 755 = rwxr-xr-x (所有者全权限,其他人可读执行)
  • 644 = rw-r--r-- (所有者可读写,其他人只读)
  • 600 = rw------- (仅所有者可读写)

Q4: 如何理解目录的执行权限(x)?

A: 目录的执行权限意味着:

  • ✅ 可以 cd 进入目录
  • ✅ 可以访问目录下的文件
  • ❌ 没有 x 权限: 无法进入目录,即使有读权限
[root@/]$ chmod /home 644
# rw-r--r-- = 没有执行权限
[alice@/]$ cd /home
cd: 权限不足

Q5: 相对路径和绝对路径有什么区别?

A:

  • 绝对路径: 从根目录(/)开始的完整路径

    /home/user/file.txt
  • 相对路径: 从当前目录开始的路径

    # 当前在 /home
    user/file.txt          # 进入user目录
    ../admin/file.txt      # 返回上一级,再进入admin
    ./file.txt             # 当前目录的file.txt

Q6: 为什么目录不能删除自己?

A: 这是文件系统的保护机制:

  • 目录包含 . (指向自己) 和 .. (指向父目录)
  • 删除目录会破坏这个结构
  • 必须先删除目录中的所有内容,或使用 rm -r

Q7: 如何递归删除目录?

A: 使用 rm -r 命令:

[root@/]$ rm -r /home/testdir

这会删除目录及其所有内容(文件和子目录)。

Q8: 文件所有者和组有什么区别?

A:

  • 所有者(UID): 文件的拥有者,权限最高
  • 用户组(GID): 协作用户组,同组用户共享权限

权限检查顺序:

  1. 如果是所有者 → 使用所有者权限
  2. 如果在同组 → 使用用户组权限
  3. 否则 → 使用其他用户权限

Q9: 如何查看当前路径?

A: 使用 pwd 命令:

[alice@/home/user1]$ pwd
/home/user1

Q10: Shell 支持哪些特殊路径?

A:

  • / - 根目录
  • . - 当前目录
  • .. - 父目录
  • ~ - 不支持(这是bash功能,本Shell未实现)

附录: 命令速查表

命令 功能 示例
useradd <name> 创建用户 useradd alice
userdel <uid> 删除用户 userdel 1
groupadd <name> 创建组 groupadd devs
groupmod <gid> <uid> 添加用户到组 groupmod 3 1
su <uid> 切换用户 su 1
whoami 显示用户 whoami
ls [path] 列出目录 ls /home
mkdir <path> 创建目录 mkdir /test
touch <path> 创建文件 touch /a.txt
rm <path> 删除 rm /a.txt
rm -r <path> 递归删除 rm -r /dir
mv <src> <dst> 移动/重命名 mv /a /b
cp <src> <dst> 复制 cp /a /b
chmod <path> <p> 修改权限 chmod /a 755
chown <path> <u> [g] 修改所有者 chown /a 1 2
cd <path> 切换目录 cd /home
pwd 显示路径 pwd
help 帮助 help
exit 退出 exit

版本信息

  • 版本: 1.0
  • 最后更新: 2025
  • 项目: UNIX 文件权限模拟器

祝使用愉快! 🚀