
大家好,欢迎来到 huangjin007_ 的博客
⭐ 个人主页:huangjin007_
🔥 文章收录专栏:Linux 内功修炼手册(系统篇)
总会有一些坚持
能从冰封的土地里
培育出十万朵怒放的蔷薇
Linux 系统篇(四) ------ 权限详解(一)
文章目录
- [Linux 系统篇(四) ------ 权限详解(一)](#Linux 系统篇(四) —— 权限详解(一))
-
- [一、Linux 的用户体系](#一、Linux 的用户体系)
-
- [1. 超级用户 vs 普通用户](#1. 超级用户 vs 普通用户)
- [2. su 命令](#2. su 命令)
- [3. 临时借用管理员权限:sudo](#3. 临时借用管理员权限:sudo)
-
- [3.1 谁可以用 sudo?](#3.1 谁可以用 sudo?)
- [二、权限的本质:角色 + 目标属性](#二、权限的本质:角色 + 目标属性)
-
- [1. 三种角色(访问者分类)](#1. 三种角色(访问者分类))
- [2. 权限字符串:`ls -l`](#2. 权限字符串:
ls -l) - [3. 基本权限:r、w、x 的含义](#3. 基本权限:r、w、x 的含义)
- 三、修改权限和归属
- 四、目录权限的三个灵魂问题
-
- [问题 1:目录的 r、w、x 到底管什么?](#问题 1:目录的 r、w、x 到底管什么?)
- [问题 2:能不能只给人"进入目录"的能力?](#问题 2:能不能只给人“进入目录”的能力?)
- [问题 3:为什么普通用户能删掉别人的文件?](#问题 3:为什么普通用户能删掉别人的文件?)
- 结语:
一、Linux 的用户体系
我们常说"权限管理",首先要清楚的是:系统里到底有哪些人?
Linux 的权限,本质上就是不同身份的人,对不同文件(或目录)能做不同的事情。
1. 超级用户 vs 普通用户
Linux 下的用户分为两种:
- 超级用户(root)
它对系统拥有绝对控制权,可以读取、修改、删除任何文件,甚至可以关机、重启、卸载软件等,一切操作几乎不受限制。- 普通用户
由 root 创建,普通用户只能在自己有权限的范围内活动,无法随意修改系统关键目录(比如/etc、/usr/bin),否则终端会报错:Permission denied(权限不足)。
怎么看当前是谁?看提示符。
- 如果命令行前面的符号是
#,说明当前是 root 用户。

- 如果命令行前面的符号是
$,说明当前是 普通用户。

2. su 命令
很多时候我们会需要在普通用户和 root 之间来回切换,就用 su(switch user)。
命令格式:
bash
su [用户名]
-
从 root 切换到普通用户

因为 root 是最高权限,降级到普通用户时 不需要输入密码。
-
从普通用户切换到 root

这时系统会提示输入 root 的密码。输入正确才能切换成功。
一个小坑:
su和su -有什么区别?
su root只切换用户身份,但环境变量还是原来普通用户的,可能会因为找不到命令而带来麻烦。su -或者su - root不但切换用户,还会加载 root 的环境变量。
同理,从 root 切换到普通用户时,也可以使用su - 用户名来完整加载该用户的环境。
3. 临时借用管理员权限:sudo
每次要用 root 权限都切到 root 用户,不但麻烦,而且长时间保持 root 状态操作系统也危险。所以 Linux 提供了一个更灵活的工具:sudo。
sudo 的全称是 Super User DO,意思是"以超级用户身份做某事"。
你不必完全变成 root,但可以让某一条命令临时拥有 root 的权限。
比如普通用户安装软件:
bash
sudo apt install vim
输入当前用户的密码(注意不是 root 密码),系统确认该用户有 sudo 权限后,就会以 root 身份执行这条命令。
3.1 谁可以用 sudo?
不是每个普通用户都能直接用 sudo,必须由管理员事先授权。授权配置文件在 /etc/sudoers。
一个典型的授权行如下:

意思是用户 whb 可以在任何主机上以任何身份执行任何命令,即拥有完全 sudo 权限。
如果未授权的用户尝试用 sudo,会收到报错:
whb is not in the sudoers file. This incident will be reported.
二、权限的本质:角色 + 目标属性
Linux 权限设计可以用一句话概括:
谁(Who),对什么(What),能做什么(How)?
这就是权限的"人---事物---能力"模型。
1. 三种角色(访问者分类)
对于任何一个文件或目录,Linux 会把可能接触它的人分成三类:
-
拥有者(Owner,用
u表示)通常是创建文件的那个人。拥有者对该文件有最高的话语权(除了 root 可以无视一切)。
-
所属组(Group,用
g表示)把文件归属到一个用户组,组里所有成员共享对该文件的同一套权限。比如一个项目组的同事都需要读写某个共享文件,就会把他们放入同一个用户组。
-
其他人(Others,用
o表示)既不是拥有者,也不在所属组里的其他用户。系统和外界"访客"通常就落在这类。
重要特性:三类角色是互斥的。
系统在判断权限时,会按拥有者 -> 所属组 -> 其他人的顺序检查,只要匹配到其中一个身份,就直接使用对应的权限,不再往后看。
2. 权限字符串:ls -l
当我们执行 ls -l 查看文件时,最左侧会看到一串类似 -rw-rw-r-- 的符号,一共 10 个字符。

我们拆解-rw-rw-r--这个字符串:
| 位序 | 含义 | 值 |
|---|---|---|
| 第 1 位 | 文件类型 | - 表示普通文件 |
| 第 2~4 位 | 拥有者(u)的权限 | rw- 读、写、不可执行 |
| 第 5~7 位 | 所属组(g)的权限 | rw- 读、写、不可执行 |
| 第 8~10 位 | 其他人(o)的权限 | r-- 只读 |
第 1 位的常见符号:
-:普通文件(文本、图片、可执行程序等)d:目录(文件夹)l:软链接(类似 Windows 快捷方式)b:块设备文件(如硬盘、U 盘)c:字符设备文件(如键盘、鼠标、终端)p:管道文件(用于进程间通信)
3. 基本权限:r、w、x 的含义
每个角色都能获得三种基本权限的组合:
- r(读,Read):
- 对文件:可以查看文件内容(用
cat、more等)。- 对目录:可以列出目录下有哪些文件(用
ls)。
- w(写,Write):
- 对文件:可以修改文件内容(用
vim、echo >等)。- 对目录:可以在目录下创建、删除、重命名文件(
touch、rm、mv等)。
- x(执行,eXecute):
- 对文件:可以把文件当作程序运行。
- 对目录:可以"进入"该目录(用
cd)。
如果某个位置是 -,就表示 没有该项权限。
八进制数值表示法:
每一组权限(u/g/o)的 rwx 如果存在看成 1,是 - 就看成 0。
rwx-> 111 = 7
rw--> 110 = 6
r-x-> 101 = 5
r---> 100 = 4
所以整个文件权限可以简洁地用三个数字表示,如 755、644 等。
例如 -rwxr-xr-- 的数值表示就是 754:
拥有者:
rwx= 7所属组:
r-x= 5其他人:
r--= 4
三、修改权限和归属
1. chmod:修改文件的访问权限
chmod(change mode)就是用来设置文件或目录权限的命令。
格式:
bash
chmod [选项] 权限 文件名
谁可以改?
- 文件拥有者 和 root 可以改权限,其他人不行。
权限的表达方式有两种:字符法 和 数字法。
(1)字符法
格式为:[用户符号][操作符][权限字符]
用户符号:
u:拥有者g:所属组o:其他人a:所有人(all,相当于 ugo 一起)
操作符:
+:增加某个权限-:去掉某个权限=:强制设置为某个权限(会覆盖之前的)


(2)数字法
用三个八进制数字分别代表 u、g、o 的权限。

2. chown:修改文件的拥有者
chown(change owner)用来更换文件的主人。
格式:
bash
chown [选项] 新用户名 文件名

注意:这个操作是管理员的专属权力。
普通用户不能把文件的所有权交给别人,这是系统安全设计。如果普通用户执行 chown,会提示 Operation not permitted。
若确实需要,必须配合 sudo 提权:
bash
sudo chown user1 f1
3. chgrp:修改文件的所属组
chgrp(change group)用来修改文件属于哪个用户组。
格式:
bash
chgrp [选项] 组名 文件名

同样,修改组也可能需要相应权限,通常文件拥有者可以把自己的文件改到一个他所属的组,但跨组改动往往也需要 sudo。
四、目录权限的三个灵魂问题
很多容易把"目录的权限"和"文件的权限"混为一谈。下面三个问题帮你彻底拔掉这个钉子。
问题 1:目录的 r、w、x 到底管什么?
| 权限 | 对目录的意义 | 对应的能力 |
|---|---|---|
| r | 可以读取目录的内容列表 | 能执行 ls 查看目录下有哪些文件名 |
| w | 可以修改目录的内容 | 能在目录下创建、删除、重命名文件(touch、rm、mv) |
| x | 可以进入目录 | 能 cd 进入该目录,作为当前工作目录 |
很明显,对于目录来说,x 权限是基础。如果一个目录你没有 x 权限,就算它有 r 权限,你也无法进入,完全拿它没办法。



问题 2:能不能只给人"进入目录"的能力?
假设我们有一个目录 test_dir,现在只给其他人 x 权限:
bash
chmod o=x test_dir
此时其他用户(o)的权限是 --x。
会发生什么?
- 该用户可以
cd test_dir成功进入目录。- 进入后执行
ls会报错,因为没有 r 权限,看不到文件列表。- 但是!如果该用户事先知道目录里某个具体文件的完整路径,比如
test_dir/readme.txt,并且他对那个文件拥有读权限,那么他就可以直接cat test_dir/readme.txt读取文件内容。
理解:你朋友家门牌号被遮住了(没有 r),但你记住了路(有 x),依然可以走到门前。只要门本身是开着的(文件有 r 权限),你就能看到里面的内容。
这里还要注意一点:
任何用户,无法进入其他用户的家目录!
问题 3:为什么普通用户能删掉别人的文件?
假设有两个普通用户 alice 和 bob,他们在同一个目录 /shared 下工作,目录权限是 rwxrwxrwx(777)。
alice 创建了一个文件 alice.txt,权限是 rwx------(只有 alice 自己能读写执行)。
现在 bob 去删这个文件:
bash
rm /shared/alice.txt
结果竟然删掉了! 明明 bob 对 alice.txt 没有任何写权限啊?
原因在于 Linux 的一个核心逻辑:
删除一个文件,本质上并不是修改这个文件的内容,而是在修改它"所在目录"的内容。
你把目录想象成一个花名册,删除文件只是从名册上划掉一个名字。至于文件本身的属性,并不直接决定能否被删除。
所以,删除文件需要的能力是:
- 对 所在目录 拥有 w(写) 权限(能修改名册)
- 对 所在目录 拥有 x(执行) 权限(能进入该目录到达名册前)
- 文件本身的权限,删除时不关心。

结语:
今天的内容到这里就结束了,希望你能有所收获~
干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _