Linux 深入理解权限
一.权限
1.权限是什么
结合生活实际,我们可以知道:权限是用来约束我们能做什么,不能做什么的东西。对于Linux来说,有着一切皆文件的思想,所以我们对权限的一切行为(修改)都会基于文件进行。根据上篇文章的文件权限,我们能得出一个重要结论:权限=角色+属性。
2.对权限的理解
既然权限=角色+属性,我们也可以进一步得出:权限约束角色的行为,并约束目标的特定属性。就好比:学校看门的保安,在你进校门时不会拦你,是因为你是学生这个角色,并不是因为你是什么特定的人;你不可能在leetcode上看电影,也不可能在某视频软件上写代码,因为这些目标本身不带有那些属性。接下来我们就谈谈在Linux中的角色与属性。
3.Linux中的角色
总的来说,Linux中的角色大致可以分为三个:拥有者(user),所属组(group),其他(other)。我们新建一个目录来看看这个目录的角色分配。
mkdir filename
wujiahao@VM-12-14-ubuntu:~$ mkdir test
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
由上篇文章的基础我们已经得知前面的信息代表着什么:1位表示文件类型+3位用户权限+3位所属组权限+3位其他权限。
1.拥有者
简单来说,拥有者就是当前目录的创建者,他们用有这个文件的生杀大权,同时也可以修改对其他用户的各种权限。
2.所属组
所属组的出现是对角色的更细化区分,举个例子:现在公司拟用赛马模式令两个不同的项目组完成同一个软件。那么可以假定老板是机器的拥有者,由A,B两组来完成这个项目:
由之前的讲解我们知道,每在一台机器上创建一个用户,对应的家目录就会出现相应的用户的目录
例如我自己的机器上的多个用户。
wujiahao@VM-12-14-ubuntu:~$ tree /home
/home
├── lesson2
│?? ├── mydir
│?? │?? ├── hello.txt
│?? │?? ├── nature.txt
│?? │?? ├── poet.txt
│?? │?? ├── test.c
│?? │?? └── test.i
│?? └── yourdir
├── lighthouse [error opening dir]
├── ubuntu [error opening dir]
├── wujiahao
│?? ├── gitcode
│?? │?? ├── file4
│?? │?? ├── file5
│?? │?? └── ReadMe
│?? └── test
└── wujiaqi [error opening dir]
对于公司中的其他人,也可能在使用这个机器,但是对于这个项目而言,只需要你们AB两个组有相应的权限即可,其他人是无权干涉的。
那么这里的AB,就可以被称为是所属组。
3.其他
对于这个项目而言,拥有者是老板,所属组为AB,那么其他的与项目无关的员工就是其他。
4.用户的权限
用户可以被分为root(超级用户)和普通用户。root拥有在系统中的最高权限——只有你想不到没有他做不到。而用户的权限,可以说是实现了Linux多用户系统隔离性的重要机制。
我们不妨查看家目录下的各个用户
ll
wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ./
drwxr-xr-x 20 root root 4096 Sep 12 16:06 ../
drwxr-xr-x 3 root root 4096 Sep 9 20:33 lesson2/
drwxr-x--- 2 lighthouse lighthouse 4096 Sep 7 20:53 lighthouse/
drwxr-x--- 4 ubuntu ubuntu 4096 Sep 7 20:53 ubuntu/
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 15:47 wujiahao/
drwxr-x--- 3 wujiaqi wujiaqi 4096 Sep 10 09:55 wujiaqi/
看看wujiahao和wujiaqi两个用户,他们的权限都只对拥有者开放rwx,所属组开放rx,其他用户全部屏蔽。那么作为wujiahao的我想去访问wujiaqi的家目录:
wujiahao@VM-12-14-ubuntu:/home$ whoami
wujiahao
wujiahao@VM-12-14-ubuntu:/home$ cd /home/wujiaqi
-bash: cd: /home/wujiaqi: Permission denied
就会被拒绝,也就是说:每创建一个用户,家目录中就会出现对应的目录,而用户各自的家目录相对于其他用户都是被隔离的。
那么,对于这种隔离,是不是绝对的铁律呢?
实际上也并不是,root用户可以访问任意用户的家目录。
root@VM-12-14-ubuntu:~# pwd
/root
root@VM-12-14-ubuntu:~# whoami
root
root@VM-12-14-ubuntu:~# cd /home/wujiaqi
root@VM-12-14-ubuntu:/home/wujiaqi# pwd
/home/wujiaqi
没错,root用户就是可以这么为所欲为,不仅可以进入其他普通用户家目录,而且可以在他们各自的目录下创建删除目录,甚至可以直接把这个普通用户删掉。
5.sudo与权限
实际上,用户和用户之间的壁垒也并不是绝对的。普通用户可以通过执行sudo命令完成暂时的提权来获得root的权限,如下:
wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao:
在普通用户的账号下,sudo指令最常用的是我们安装某些指令。
wujiahao@VM-12-14-ubuntu:/home$ sudo apt install zip
[sudo] password for wujiahao:
那么现在有个很大的问题
问题:用户之间能通过sudo提权跨过壁垒,root用户能随意执行各种指令,Linux的权限到底还有什么意义?
不急,其实这反而能体现Linux的多用户精髓所在。虽然sudo能让普通用户暂时获得最高权限,但是你不妨想一想,是所有人都能用sudo指令吗?
wujiahao@VM-12-14-ubuntu:/home$ sudo cd /home/wujiaqi
[sudo] password for wujiahao:
wujiahao is not in the sudoers file. This incident will be reported.
作为普通用户的我试图通过sudo去访问其他用户的家目录,结果出现这些提示:我不在sudoers这个文件中。sudoers文件,实际上就是我们常说到的白名单。这里我们用root进入sudoers一探究竟
这个白名单上,压根就没有任何人的用户名——也就是说,当前这台机器,没有任何人能执行sudo指令。再来回头看看sudoers文件的属性:
drwxr-x--- 2 root root 4096 Sep 7 20:52 sudoers.d/
它的拥有者和所属组都是root,并且不允许其他用户有任何权限。也就是说:要执行sudo——当前用户需要在白名单——白名单只有root有权限进行修改。也就是说,实际上依然是root掌管一切,其他用户只有经过root的同意才能将名字留在sudoers上。
6.Linux中的属性
1.权限一览
1.说完角色,我们再来谈谈属性。
上文反复提到rwx,那么他们到底是什么东西?
r(read):可读权限
w(write):可写权限
x(execute):可执行权限
wujiahao@VM-12-14-ubuntu:/home$ ll
total 28
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ./
drwxr-xr-x 20 root root 4096 Sep 12 16:31 ../
drwxr-xr-x 3 root root 4096 Sep 9 20:33 lesson2/
drwxr-x--- 2 lighthouse lighthouse 4096 Sep 7 20:53 lighthouse/
drwxr-x--- 4 ubuntu ubuntu 4096 Sep 7 20:53 ubuntu/
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 15:47 wujiahao/
drwxr-x--- 3 wujiaqi wujiaqi 4096 Sep 10 09:55 wujiaqi/
作为文件的拥有者,我们可以任意修改各个角色对该文件的权限。例如:先创建一个文件my.txt
wujiahao@VM-12-14-ubuntu:~$ touch my.txt
wujiahao@VM-12-14-ubuntu:~$ ls
gitcode my.txt test
wujiahao@VM-12-14-ubuntu:~$ ll
total 56
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:38 ./
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 4960 Sep 12 16:38 .bash_history
-rw-r--r-- 1 wujiahao wujiahao 220 Sep 8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep 8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep 8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao 20 Sep 11 20:19 .lesshst
-rw-rw-r-- 1 wujiahao wujiahao 0 Sep 12 16:38 my.txt
-rw-r--r-- 1 wujiahao wujiahao 807 Sep 8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 4994 Sep 11 20:15 .viminfo
-rw------- 1 wujiahao wujiahao 183 Sep 12 15:32 .Xauthority
接着修改my.txt的权限
chmod u/g/o +/- rwx
----rw-r-- 1 wujiahao wujiahao 0 Sep 12 16:38 my.txt
再试着访问my.txt
vim my.txt
发现已经被拒绝。
2.目录的权限
进入/退出目录需要x权限,那么rw对目录意味着什么?
r:没有r无法看到目录中的文件 ,但可以在目录中创建文件
w:如果没有w无法在指定目录中创建文件
wujiahao@VM-12-14-ubuntu:~$ ll
total 64
drwxr-x--- 5 wujiahao wujiahao 4096 Sep 12 16:55 ./
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ../
-rw------- 1 wujiahao wujiahao 5365 Sep 12 16:58 .bash_history
-rw-r--r-- 1 wujiahao wujiahao 220 Sep 8 18:51 .bash_logout
-rw-r--r-- 1 wujiahao wujiahao 3771 Sep 8 18:51 .bashrc
drwx------ 2 wujiahao wujiahao 4096 Sep 8 20:21 .cache/
drwxrwxr-x 3 wujiahao wujiahao 4096 Sep 11 20:15 gitcode/
-rw------- 1 wujiahao wujiahao 20 Sep 11 20:19 .lesshst
--wxrw-r-- 1 wujiahao wujiahao 23 Sep 12 16:55 my.txt*
-rw-r--r-- 1 wujiahao wujiahao 807 Sep 8 18:51 .profile
drwxrwxr-x 2 wujiahao wujiahao 4096 Sep 12 15:47 test/
-rw------- 1 wujiahao wujiahao 8591 Sep 12 16:49 .viminfo
-rw------- 1 wujiahao wujiahao 183 Sep 12 15:32 .Xauthority
wujiahao@VM-12-14-ubuntu:~$ chmod u-x gitcode
wujiahao@VM-12-14-ubuntu:~$ cd ./gitcode
-bash: cd: ./gitcode: Permission denied
可以看到,我们去掉x权限,是无法进入目录的。
2.重要问题解释
接着来谈几个问题
问题1:能修改其他人的文件的权限吗?
回答1:不能,用户只能修改自己的文件的权限
如下测试,用户只能修改拥有者为自己的文件,试图修改其他用户的文件会直接被拒绝
wujiahao@VM-12-14-ubuntu:~$ cd /home/lesson2
wujiahao@VM-12-14-ubuntu:/home/lesson2$ ll
total 12
drwxr-xr-x 3 root root 4096 Sep 9 20:33 ./
drwxr-xr-x 7 root root 4096 Sep 10 09:22 ../
drwxr-xr-x 2 root root 4096 Sep 10 09:37 mydir/
-rw-r--r-- 1 root root 0 Sep 9 20:34 yourdir
wujiahao@VM-12-14-ubuntu:/home/lesson2$ chmod u-r mydir
chmod: changing permissions of 'mydir': Operation not permitted
问题2:当拥有者本人没有某项权限,但所属组包含拥有者,且有这个权限,会发生什么?
回答2:Linux中想要对文件进行操作,首先会确认你是什么角色;既然确定了你是拥有者,并且没有该权限,那你便无权访问,而不会进行再次匹配角色。
例如我们这里以wujiahao身份创建了my.txt,并修改了拥有者的read权限。
wujiahao@VM-12-14-ubuntu:~$ chmod u-r my.txt
--wxrw-r-- 1 wujiahao wujiahao 0 Sep 12 16:38 my.txt*
wujiahao@VM-12-14-ubuntu:~$ vim my.txt
此时会发现即使所属组包含wujiahao且有read权限,但在匹配角色时只会匹配一次,read操作被拒绝。
问题3:root用户的权限真的无限吗?
回答3:是的,不要用你有限的认知挑战root无限的权限
不管是进入家目录,打开my.txt,修改my.txt,都如入无人之境。。。
root@VM-12-14-ubuntu:/home/wujiahao# whoami
root
root@VM-12-14-ubuntu:/home/lesson2/mydir# cd /home/wujiahao
root@VM-12-14-ubuntu:/home/wujiahao# ll
--wxrw-r-- 1 wujiahao wujiahao 0 Sep 12 16:38 my.txt*
root@VM-12-14-ubuntu:/home/wujiahao# vim my.txt
root@VM-12-14-ubuntu:/home/wujiahao# cat my.txt
I am root
I am supreme
问题4:如何理解x(可执行)权限?
回答4:可执行权限!=文件可以执行
我们知道,要进入目录首先需要x权限。而对于可执行文件(编译之后的c程序文件)可执行权限才有意义,如果一个文件没有可执行的属性(如普通文本文件),即使有可执行权限x也没有太大意义。
问题5:有了属性更改的指令chmod,有没有角色更改的指令?
回答5:有,叫做chown/chgrp,用于修改当前目录的拥有者或所属组
需要注意的是,操作系统默认不支持更改拥有者或所属组(有点甩锅的意思。。),需要更高权限(sudo或root用户)才能执行这个指令。
7.权限表示法——八进制表示法
八进制表示法是一种更简洁、常用于命令设置权限的方法。它将每一组权限(rwx)视为一个二进制数,然后转换为一个八进制数字。
计算原理:
每个权限都有一个固定的数值:
-
r (读) = 4
-
w (写) = 2
-
x (执行) = 1
-
- (无权限) = 0
要计算一组的权限数字,只需将其有权限的值相加即可。
权限组合 | 计算过程 | 八进制数字 |
---|---|---|
--- | 0 + 0 + 0 | 0 |
--x | 0 + 0 + 1 | 1 |
-w- | 0 + 2 + 0 | 2 |
-wx | 0 + 2 + 1 | 3 |
r-- | 4 + 0 + 0 | 4 |
r-x | 4 + 0 + 1 | 5 |
rw- | 4 + 2 + 0 | 6 |
rwx | 4 + 2 + 1 | 7 |
格式:
整个文件的权限由三个八进制数字表示,分别对应所有者、所属组和其他用户。
[所有者权限数字][所属组权限数字][其他用户权限数字]
示例:
# 将 file.txt 的权限设置为 644 (rw-r--r--)
chmod 644 file.txt# 将 script.sh 的权限设置为 755 (rwxr-xr-x),使其可执行
chmod 755 script.sh# 将目录 mydir 及其内部所有内容权限设置为 700 (rwx------)
chmod -R 700 mydir
# -R 选项表示递归操作
8.缺省权限与umask
1. 什么是缺省权限?
当你在 Linux 中创建一个新的文件或目录时,系统并不会给它分配 777
(rwxrwxrwx) 或 666
(rw-rw-rw-) 这样宽松的权限,而是会遵循一个更安全、更合理的原则。这个系统自动赋予的初始权限,就叫做缺省权限(Default Permissions)。
系统有一个预定义的最大权限,但会用一个叫做 umask
的值来“削减”这个最大权限,从而得到最终的缺省权限。
-
文件的最大初始权限是
666
(rw-rw-rw-),即没有执行(x
)权限。这是出于安全考虑,防止新创建的文件自动拥有可执行权限。 -
目录的最大初始权限是
777
(rwxrwxrwx),因为目录需要可执行(x
)权限才能被进入和访问。
2. 什么是 umask?
umask(用户文件创建掩码)是一个用于控制缺省权限的机制。它是一个四位的八进制数字(通常第一位是特殊权限位,常为0,所以通常我们看到的是后三位),它定义了创建新文件或目录时需要从最大权限中移除(屏蔽掉)的权限。
你可以把它理解为一个“权限过滤器”或“遮罩”。系统用最大权限减去 umask 值,就得到了实际的缺省权限。
查看当前 umask 值:
使用 umask
命令即可。
$ umask
0002
# 或者
$ umask -S
u=rwx,g=rwx,o=rx
# 符号表示法,显示了最终用户拥有的权限,而不是掩码本身
最终权限计算=起始权限 & (~umask)
3. 如何设置和修改 umask?
umask 值可以在以下几个级别设置:
a. 临时修改 (对当前Shell会话有效)
直接在终端中输入 umask
命令加上新的值。
# 将 umask 设置为 077 (非常严格,仅用户自己可读写)
umask 077# 验证
umask
# 输出:0077# 之后创建的新文件权限将是 600 (rw-------)
# 之后创建的新目录权限将是 700 (rwx------)
b. 永久修改 (对用户生效)
将 umask
命令添加到用户的 shell 配置文件中,这样每次登录都会自动设置。
-
对于 Bash 用户,编辑
~/.bashrc
文件。 -
对于 Zsh 用户,编辑
~/.zshrc
文件。
在文件末尾添加一行,例如:
# 设置 umask 为 002,便于组协作
umask 002
然后运行 source ~/.bashrc
(或 source ~/.zshrc
)使更改立即生效,或者重新打开终端。
c. 系统全局修改 (不推荐轻易修改)
可以修改 /etc/profile
或 /etc/bash.bashrc
这样的全局配置文件来为所有用户设置默认 umask。但这会影响整个系统,需要谨慎操作。