Linux 权限管理与文件属性详解
概述
本文主要介绍 Linux 中的文件权限,包括认识什么是权限,认识文件属性和文件权限,学习指令 sudo、chmod、chgrp、chown 等,还有认识目录权限,缺省权限以及粘滞位。
一、权限的概念
1. 什么是权限
在现实生活中,可以通过常识确定:权限是限制人的。人=真实的人 + 身份角色,也就是权限会给不同身份的人不同限制。目标事物的属性也会影响权限。比如你不能在短视频软件上写代码,也不能在写代码软件上看短视频。总之,权限 = 人 + 事物属性。最终影响你能还是不能做一件事。
2. 认识人——用户
**Linux 下有两种用户:超级用户(root)、普通用户。**超级用户:可以在 linux 系统下做任何事情,不受限制。普通用户:在 linux 下做有限的事情。超级用户的命令提示符是'#',普通用户的命令提示符是'$'。
3. su 指令:切换用户
1. root 用户下: su [普通用户] 可以直接切换,无需密码。
2. 普通用户下: 直接使用 su 或者使用 su -,然后输入 root 账户密码即可切换。
su:只切换身份,不改变路径。
su -:重新登录 root 账户,进入 root 家目录,并且显示上次登录时间。
3. 普通用户之间的切换: su [用户名],然后需要输入对方账户密码(所在路径不会切换)。
快捷键:Ctrl + D
快速切换成上一个用户,本质是 exit 指令。
二、sudo 提权
如果我们想以普通用户的身份去执行更高权限的命令,就需要使用 sudo。 sudo 就是提权,获取更高权限,一般放在指令最前面使用。比如我们以普通用户创建一个文件,再使用 sudo 提权创建一个文件,可以明显看到文件属性中用户名称的变化,所以 sudo 提权本质就是以 root 身份去执行命令。但这里有一个疑问?我们使用 sudo 提权后,系统要求我们输入当前用户的密码,而不是 root 账户的密码,这是为什么呢?
配置文件——sudoers
其实如果是新创建的用户,是无法使用 sudo 提权的,如:系统提示无法执行命令,并提到了一个文件——sudoers,其实这就是一个配置文件。该文件只能使用 root 账号才能打开,其实这文件就相当于一个白名单,只有写入了该名单的账号才能执行 sudo 指令。该文件位于 /etc/sudoers,我们使用 root 账户打开。在该文件的 100 行左右,就能查看该白名单了,当我们将 user1 添加进白名单后,user1 就能正常使用 sudo 指令了。(建议学完 vim 的使用后再进行配置修改)。
这样大概能理解为什么使用 sudo 需要输入当前普通用户的密码了吧,因为配置文件时 root 已经默许了,输入当前用户密码只是确实是当前用户在操作。
sudo 的使用场景:
目前我们比较常见的使用场景就是下载软件时使用了。比如 sudo yum install ... / sudo apt install ...。
普通用户使用 sudo 并输入密码后,短时间(大概 15min)以内再次使用 sudo 是不需要输入密码的。
三、文件属性和访问权限
前面说过,权限=角色 + 事物属性,而在 Linux 中,一切皆文件,文件的属性就和权限密切相关。
1. 对文件属性的基本了解
首先通过 ll 就可以快速查看文件的属性。现在我们来认识文件的这些属性:关于后面 3 列:文件大小、修改时间、文件名,这些是我们比较熟悉的属性就不多说了。我们先具体认识一下文件类型有哪些:
- d:目录(文件夹)
- -:普通文件
- c:字符设备文件,例如屏幕等串口设备
- b:块设备文件,例如硬盘、光驱等
- p:管道文件
- l:链接文件,类似 Windows 的快捷方式
2. 认识拥有者和所属组
第一列用户名代表的就是该文件的拥有者,一般谁创建就是谁;第二列用户名就代表该文件的所属组,默认是创建者单独一组,不过可以修改。Linux 中的角色分 3 类:文件拥有者、文件所属组、other。other 不需要存储,只要是拥有者或者所属组就一定不是 other,所以 other 不显示。注意角色是一层身份,它需要依附于具体的人,人 = 真实的人 + 身份角色。所属组存在的原因,是多人使用同一台服务器时,便于分组管理权限,比如某些文件哪些人可看那些人不可看就可以通过所属组实现。接下来我们来看具体的访问权限:
3. 认识文件的访问权限
首先需要知道这些权限:r 代表可读权限、w 代表可修改权限、x 代表可执行权限。除去第一列代表文件类型的字符,剩下的 9 个字符每 3 个为一组,分别代表拥有者权限、所属组权限、other 权限。(- 代表无此权限)。以拥有者为例,rwx 一组,这 3 个字母的位置是固定的,有这个权限对应位置就有这个字母,没有就是 - 。下面我们来讲如何修改这些权限:
四、chmod 指令
1. 用法 1:chmod [角色字符][+/-/=][权限] [文件名]
chmod 指令就是用来设置文件的访问权限。 角色字符:
- u:拥有者
- g:所属组
- o:其它用户
- a:所有用户 + / - / = :
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限 常用选项:
- R -> 递归修改目录文件的权限 说明:只有文件的拥有者和 root 才可以改变文件的权限。
演示:
取消拥有者 w 权限,使其无法写入文件。
取消拥有者 r 权限,使其无法读文件。
取消所属组的 rw 权限。
取消 other 的 r 权限。
一次性给三位角色增加不同权限。
一次性取消三位角色的不同权限。
给所有人增加 r 权限。
给所有人取消 r 权限。
最后,给所有人增加所有权限:(绿色一般代表可执行文件,但 test.txt 并不是一个可执行文件)Linux 下能执行 = 真的是一个可执行文件 + 可执行权限。
给所有人取消可执行文件。
注意,取消权限时即使有角色对应权限本来就没有,也不会有影响,所以 a-rwx 就能直接取消全部权限。然后如果增加或者取消权限时,没有带上用户字符,直接 + 或者 - 权限时,默认是给所有人加减权限。只有文件的拥有者和 root 能修改文件的访问权限。
"Permission denied"的核心翻译是'权限被拒绝'。
一些结论
(1)root 不受访问权限约束:
root 用户可以无视文件权限进行操作。
(2)文件识别访问者身份时,只会识别一次
你有没有疑惑过,一个用户既是文件的拥有者又是文件的所属组,那他能通过所属组的权限来访问文件吗?如:很明显,user1 作为拥有者和所属组,如果对应拥有者权限没有,即使对应所属组有权限,那 user1 也不能访问文件。这就是因为文件在第一次识别操作者身份时,会依次对比其是否为:拥有者->所属组->other。一旦识别到操作者身份为拥有者时,就不会往下识别了,以后该操作者只能使用拥有者的权限。同理,如果操作者为所属组,在文件第一次识别到操作者身份是所属组后,以后该操作者只能使用该文件的所属组权限。我们可以使用 chgrp 指令修改所属组对应的用户(下文详说)。
2. 用法 2:chmod [数字] [文件名]
3 个字符为一组的权限,每个位置有两种情况 (r/-)(w/-)(x/-),在 C 语言中 1 表示有 0 表示无,所以 rwx 可以用二进制 111 代替,换算为八进制就是 7。所以每组权限无非以下 8 种情况:000、001、010、011、100、101、110、111;并且可以用八进制代替表示:0、1、2、3、4、5、6、7。所以 chmod 加数字就能设置文件权限。 如:给拥有者和所属组设置 rw-(110 / 6)权限、给 other 设置 r--(100 / 4)权限。 如:给所有人所有权限。 如:去掉所有人所有权限。 两种方法各有好处,自行选择即可:用法 1 可读性强,用法 2 便捷性强。
五、chgrp 和 chown 指令
1. chgrp 指令
用法:chgrp [用户名] [文件名] 功能:修改文件或目录的所属组。 演示: 注意普通用户需要 sudo 提权。 现在 txp 用户就能使用该文件的所属组权限了。 注意:以上操作在其他用户的家目录下可能不成功,这是因为家目录也存在权限,我们可以在根目录下创建一个所有人都有完整权限的目录进行操作验证。
2. chown 指令
用法 1:chown [用户名] [文件名] 说明:修改文件的拥有者,需要 root 权限或者 sudo 提权。 用法 2:chown [用户名]:[用户名] [文件名] 说明:同时修改文件的拥有者和所属组,同样需要 root 或者 sudo 提权。 演示: 修改拥有者:此时 user1 不具备拥有者权限,只有所属组权限。 同时修改拥有者和所属组。
温馨提示:如果一个用户对某文件没有 r 权限,那么该用户无论用什么工具(包括但不限于:nano、vim 等)都无法查看文件内容。
六、目录权限
前面我们都是在说普通文件的权限,那么对于目录的权限有什么不一样呢? 下面是使用 root 用户在根目录下创建的一个全权限的目录。现在,我们来了解目录的 r w x 权限分别对应什么功能: 1. 对于目录的 r 权限,如果没有就无法查看该目录下的所有文件和文件内容。 演示,只去掉 r。 2. 对于目录的 w 权限,如果没有就不能修改该目录下的所有文件,包括创建、删除、移动、拷贝等操作。 演示,只去掉 w。 3. 对于目录的 x 权限,如果没有就无法进入该目录。 演示:只去掉 x。
家目录,只有对应的拥有者拥有权限,其他普通用户没有任何权限: 同样,对于根目录,只有 root 有修改的权限:
七、缺省权限
1. 什么是缺省权限
缺省权限其实就是我们在创建文件或目录时系统默认给出的权限,一般对于普通文件缺省权限为 664(rw-rw-r--),对于目录缺省权限一般是 775(rwxrwxr-x)。但这缺省权限其实并不是文件的初始权限,对于普通文件的初始权限一般为 666(rw-rw-rw-),对于目录的初始权限一般是 777(rwxrwxrwx),那为什么最终会变为缺省权限的 664 和 775 呢?这其实的奥秘就是权限掩码->umask。
2. 权限掩码:umask
使用指令 umask 就能查看当前的权限掩码。一般默认就是 002,最前面那个 0 暂时可以忽略。哪权限掩码是做什么的呢?权限掩码的功能:设置缺省权限。 权限掩码设置缺省权限的原理:缺省权限 = 起始权限 & (~umask) 说明:这其实是二进制的位运算,缺省权限等于起始权限的二进制码与权限掩码的反码的与运算结果。 演示: 664 和 775 的缺省权限由来。
设置缺省权限演示: 用法:umask [数字] 例如 1:设置权限掩码为 000,效果就是初始权限是多少就是多少,也就是 666 和 777。 例如 2:设置权限掩码为 777,因为其反码为 000,0&任何都是 0,所以效果就是权限为 0。
umask 设置缺省权限在一些常见下还是有意义的,更加方便初始化文件的权限等等。
八、粘滞位
1. 什么是粘滞位:
粘滞位其实就是将目录权限的最后一位,也就是 other 的 x 权限修改为 t。
用法:chmod +t [目录](普通用户需要 sudo 提权)。
说明:粘滞位只能给目录设置,不需要给普通文件设置。
2. 粘滞位有什么用: 在设置了粘滞位的目录下,用户创建的文件其他人无法删除,只有文件的拥有者具有删除文件的权限。root 无视。
粘滞位的用处: 比如现在需要一个共享文件,那么 root 可以在根目录下创建一个全权限的目录,提供给所有用户使用。现在,txp 在该目录中创建一个文件,并限制其他人只有读的权限。但是,不合理的是,其他用户可以直接删掉该文件。这里的原因就是目录给了所有人修改的权限,普通文件是否可删除在于目录是否给了 w 权限,所以为了解决这个问题,粘滞位就出现了,只要使用 chmod +t 给对应目录加上粘滞位,文件的删除只能是该文件的拥有者。先加上粘滞位,目录的最后一个权限位会变为 t。此时,txp 创建一个文件。其他用户就无法删除 txp 创建的文件了。只要该文件的拥有者或者 root 才能删除该文件。
最后说明一下,Linux 根目录中存在默认的共享目录:tmp。很明显的能看到其粘滞位 t。
总结
本文涵盖了 Linux 权限管理的核心概念,从用户角色区分到文件属性解析,再到具体的权限控制指令(chmod, chown, chgrp)及特殊权限(umask, 粘滞位)。理解这些机制是进行系统安全管理和日常运维的基础。


