Linux 深入理解权限

发布于:2025-09-14 ⋅ 阅读:(24) ⋅ 点赞:(0)

一.权限

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用户)才能执行这个指令。

问题6:删除文件,与文件本身的权限有关吗?

回答6:无关。删除当前文件与当前文件所在的目录有无w写权限有关。例如,root在wujiahao创建的目录下创建文件,wujiahao是有权对该文件进行删除的。

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。但这会影响整个系统,需要谨慎操作。

9.粘滞位

当前面临一个情况:

通过以上解释我们能了解Linux的安全性,但当一个工程需要协作文档时怎么办?

没错,很容易能想到一个解决办法——共享文档,所有成员都能读写。但与此同时伴随着风险:万一有人删除文档怎么办?Linux针对这种协作文档的情况作出了特别解决办法,就是粘滞位。

首先,我们先看看Linux中的“官方协作文档”——temp文档。

wujiahao@VM-12-14-ubuntu:/$ ls
bin  boot  data  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var
wujiahao@VM-12-14-ubuntu:/$ ll
total 76

drwxrwxrwt  12 root root  4096 Sep 13 14:23 tmp/

可以看到这个文档对所有用户都开放了读和写的权限,但是出现了一个我们从未见过的标志位——t,这就是粘滞位。

chmod +t filename

由以上命令即可实现对某文档添加粘滞位,添加粘滞位后除了拥有者外其他用户均无法删除文档,即使他们有读写权限。


网站公告

今日签到

点亮在社区的每一天
去签到