【Linux 系统篇(四)】权限详解(一)
⭐个人主页:huangjin007_
🔥文章收录专栏:Linux 内功修炼手册(系统篇)
能从冰封的土地里
培育出十万朵怒放的蔷薇
Linux 系统篇(四) —— 权限详解(一)
文章目录
- Linux 系统篇(四) —— 权限详解(一)
- 一、Linux 的用户体系
- 1. 超级用户 vs 普通用户
- 2. su 命令
- 3. 临时借用管理员权限:sudo
- 3.1 谁可以用 sudo?
- 二、权限的本质:角色 + 目标属性
- 1. 三种角色(访问者分类)
- 2. 权限字符串:`ls -l`
- 3. 基本权限:r、w、x 的含义
- 三、修改权限和归属
- 1. chmod:修改文件的访问权限
- (1)字符法
- (2)数字法
- 2. chown:修改文件的拥有者
- 3. chgrp:修改文件的所属组
- 四、目录权限的三个灵魂问题
- 问题 1:目录的 r、w、x 到底管什么?
- 问题 2:能不能只给人“进入目录”的能力?
- 问题 3:为什么普通用户能删掉别人的文件?
- 结语:
一、Linux 的用户体系
我们常说“权限管理”,首先要清楚的是:系统里到底有哪些人?
Linux 的权限,本质上就是不同身份的人,对不同文件(或目录)能做不同的事情。
1. 超级用户 vs 普通用户
Linux 下的用户分为两种:
- 超级用户(root)
它对系统拥有绝对控制权,可以读取、修改、删除任何文件,甚至可以关机、重启、卸载软件等,一切操作几乎不受限制。- 普通用户
由 root 创建,普通用户只能在自己有权限的范围内活动,无法随意修改系统关键目录(比如/etc、/usr/bin),否则终端会报错:Permission denied(权限不足)。
怎么看当前是谁?看提示符。
- 如果命令行前面的符号是
#,说明当前是root 用户。
- 如果命令行前面的符号是
$,说明当前是普通用户。
2. su 命令
很多时候我们会需要在普通用户和 root 之间来回切换,就用su(switch user)。
命令格式:
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 的权限。
比如普通用户安装软件:
sudoaptinstallvim输入当前用户的密码(注意不是 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 = 7rw--> 110 = 6r-x-> 101 = 5r---> 100 = 4
所以整个文件权限可以简洁地用三个数字表示,如 755、644 等。
例如-rwxr-xr--的数值表示就是 754:
拥有者:
rwx= 7
所属组:r-x= 5
其他人:r--= 4
三、修改权限和归属
1. chmod:修改文件的访问权限
chmod(change mode)就是用来设置文件或目录权限的命令。
格式:
chmod[选项]权限 文件名谁可以改?
- 文件拥有者和root可以改权限,其他人不行。
权限的表达方式有两种:字符法和数字法。
(1)字符法
格式为:[用户符号][操作符][权限字符]
用户符号:
u:拥有者g:所属组o:其他人a:所有人(all,相当于 ugo 一起)
操作符:
+:增加某个权限-:去掉某个权限=:强制设置为某个权限(会覆盖之前的)
(2)数字法
用三个八进制数字分别代表 u、g、o 的权限。
2. chown:修改文件的拥有者
chown(change owner)用来更换文件的主人。
格式:
chown[选项]新用户名 文件名注意:这个操作是管理员的专属权力。
普通用户不能把文件的所有权交给别人,这是系统安全设计。如果普通用户执行chown,会提示Operation not permitted。
若确实需要,必须配合sudo提权:
sudochownuser1 f13. chgrp:修改文件的所属组
chgrp(change group)用来修改文件属于哪个用户组。
格式:
chgrp[选项]组名 文件名同样,修改组也可能需要相应权限,通常文件拥有者可以把自己的文件改到一个他所属的组,但跨组改动往往也需要sudo。
四、目录权限的三个灵魂问题
很多容易把“目录的权限”和“文件的权限”混为一谈。下面三个问题帮你彻底拔掉这个钉子。
问题 1:目录的 r、w、x 到底管什么?
| 权限 | 对目录的意义 | 对应的能力 |
|---|---|---|
| r | 可以读取目录的内容列表 | 能执行ls查看目录下有哪些文件名 |
| w | 可以修改目录的内容 | 能在目录下创建、删除、重命名文件(touch、rm、mv) |
| x | 可以进入目录 | 能cd进入该目录,作为当前工作目录 |
很明显,对于目录来说,x 权限是基础。如果一个目录你没有 x 权限,就算它有 r 权限,你也无法进入,完全拿它没办法。
问题 2:能不能只给人“进入目录”的能力?
假设我们有一个目录test_dir,现在只给其他人 x 权限:
chmodo=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 去删这个文件:
rm/shared/alice.txt结果竟然删掉了!明明 bob 对alice.txt没有任何写权限啊?
原因在于 Linux 的一个核心逻辑:
删除一个文件,本质上并不是修改这个文件的内容,而是在修改它“所在目录”的内容。
你把目录想象成一个花名册,删除文件只是从名册上划掉一个名字。至于文件本身的属性,并不直接决定能否被删除。
所以,删除文件需要的能力是:
- 对所在目录拥有w(写)权限(能修改名册)
- 对所在目录拥有x(执行)权限(能进入该目录到达名册前)
- 文件本身的权限,删除时不关心。
结语:
今天的内容到这里就结束了,希望你能有所收获~
干货整理到手抖,觉得有用的话,赏个三连回回血?__(:ᗤ」ㄥ)_ _