【Linux】权限理解(粘滞位设置)


1 权限的概念

所谓权限,实际上是对人的约束,在Linux中,是对普通用户的约束。一件事情,能否被实现,被谁实现,这当中就存在着权限问题。如果你是一个超级用户,那你或许可以不受权限的约束,但值得注意的是,访问的对象可能天然没有某种属性(权限),那即使是超级用户,也无法实现天然不存在的权限,就好比我们无法用水点火一样,因为水本身就没有点火的权限。
可以认为:权限 = 人 + 事物属性

在Linux下有两种用户:超级用户(root)、普通用户

① 超级用户可以Linux系统下做任何事情,不受限制。如图所示,我们可以通过命令:whoami查看当前用户,可以看到超级用户的命令提示符是 “#” 。
超级用户
② 普通用户在Linux系统下受到权限的约束,只能做有对应权限的事情。如图所示,可以看到普通用户的命令提示符是 “$” 。
普通用户

这里我们可以通过命令:su 来进行用户切换
如图所示:如果要从root用户切换到普通用户user,则使用su user(用户名);要从普通用户切换到root用户则使用su root(root可以省略),此时系统会提示输入root用户的口令,注意:Linux下输入密码时不会回显。
用户切换


2 权限管理

在前面的介绍说到,我们可以认为:权限 = 人 + 事物属性。那么在Linux下我们可以将人分为以下几类:

  1. 文件和文件目录的所有者:u — User
  2. 文件和文件目录的所有者所在的组的用户:g — Group
  3. 其他用户(不是前两类用户的都被归为其他用户):o — Others

2.1 文件类型及其访问权限

如图所示,我们可以通过命令:ls -l 来查看当前目录下的文件和目录,所展现出来的每行信息即可以称为文件属性,其中记录了文件类型,不同用户对文件的访问权限,文件大小(以字节为单位),文件最近修改时间,文件名等相关信息。可以看到,如下两个文件的所有者都是root,而因为root所在的用户组也只有root一个用户,因此,文件所有者所在的用户组也是root。

文件属性

文件属性

在Linux下,用文件属性中第一个字符来区分文件类型。文件类型主要有以下几种:

d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(如硬盘、光驱等)
p:管道文件
c:字符设备文件(如屏幕等串口设备)
s:套接口文件

其中最常见的还是文件夹普通文件两种类型的文件。

可以看到,在第一个字符后还有 9 个字符,其中每三位一组用来表示一类用户对该文件(目录)的访问权限,前三位表示的是文件所有者对该文件的访问权限;中间三位表示的是该文件所有者所在的组中的用户对该文件的访问权限;最后三位表示其他用户对该文件的访问权限。那每三位一组的字符又表示了用户对该文件的什么权限呢?如下:文件的基本权限分类:

r(读):Read对于文件而言,具有读取文件内容的权限;对于目录而言,具有浏览该目录信息的权限。
w(写):Write对于文件而言,具有修改文件内容的权限;对于目录而言,具有删除移动目录内文件的权限。
x(执行):Execute对于文件而言,具有执行文件的权限;对于目录而言,具有进入目录的权限
-:表示不具有该项权限。

以下举例说明普通用户对文件的权限:

如下图所示,在Linux中某目录 day02 下有 test.c 文件,我们通过命令 ls -l 显示出文件的属性信息,属性行中第一个字符为 - ,即表示这是一个普通文件,其后的前三位 rw- ,表示该文件所有者对文件的权限是可读、可写、不可执行(需要说明的是:因为这里的文件所有者本身就是root,而root是不受权限约束的,如果这里文件所有者只是普通用户,则其对该文件只有可读可写权限);中间三位 r-- 表示该文件所有者所在组中的用户对该文件的权限是可读、不可写、不可执行;后三位 r-- 表示其他用户对该文件的权限为可读、不可写、不可执行。通过 whoami 命令我们可以看到当前用户是名为 jml 的普通用户,相对于 test.c 文件而言属于其他用户,也就是说用户 jml 对该文件只可读。则以下测试权限:输入命令:cat test.c 输出文件内容,即为读文件,所示文件读取成功;输入命令:echo “//这是一段注释” >> test.c,试图将字符串"//这是一段注释"写入文件中,可以发现,得到了 Permission denied 的回复,被拒绝了访问,即验证了文件对用户 jml 不可写;接着输入命令:./test.c 试图执行文件,同样得到了 Permission denied 的回复,即验证了文件对用户 jml 不可执行。

权限示例

2.2 文件权限值的表示方法

上述我们看到的用 r/w/x 这三种字符来表示权限的方法是文件权限值的 字符表示方法 ,通常我们通过命令获取到的文件的属性中的权限即是采用这种方法表示出来的。除此之外,我们还可以用 八进制数值表示方法 来表示文件的权限,一位八进制数代表一类用户对文件的权限,而一位八进制数又可以用三位二进制位表示:如八进制数 6 ,用三位二进制可以表示为 110,其中:二进制位为 1 表示具有该种权限,为 0 则表示不具有该权限,对应的二进制数 110 则表示对应用户对该文件可读、可写、不可执行。

(1)字符表示方法

Linux表示 说明
r – – 只读
– w – 仅可写
– – x 仅可执行
r w – 可读可写
– w x 可写可执行
r – x 可读可执行
r w x 可读可写可执行
– – – 无权限

(2)八进制数值表示方法

权限符号(读写执行) 八进制 二进制
r – – 4 100
– w – 2 010
– – x 1 001
r w – 6 110
– w x 3 011
r – x 5 101
r w x 7 111
– – – 0 000

2.3 文件访问权限设置

文件的访问权限是否可以修改呢?答案是肯定,在Linux中,我们可以通过相关的命令来设置文件的访问权限,但需要说明的是:只有文件的所有者和root才能修改文件的权限

(1)chmod

功能: 设置文件的访问权限
格式: chmod [参数选项] 权限 文件名
常用选项: R -> 递归修改目录文件的权限
chmod命令权限值的格式: (其中权限代号既可以用字符表示法,也可以用八进制数值表示法)

  • +:向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限
  • 用户符号: u(拥有者)、g(拥有者同组用户)、o(其他用户)、a(所有用户)

示例:

文件访问权限设置
其中需要注意:当使用八进制数值表示的权限代号来设置文件访问权限时,不需要有用户符号和+/-/=符号,只需要按照数值对所有用户对该文件的权限进行整体设置。如果数值表示只写了如:4,则其表示的实际是:004 。

(2)chown

功能: 修改文件的拥有者
格式: chown [参数] 用户名 文件名

需要说明的是:要执行chown命令需要有root超级用户的权限,普通用户(即使是这个文件本来的拥有者)是没办法修改文件的拥有者的。因此,要修改文件的拥有者,要么将当前身份切换为当前用户,要么使用sudo命令为当前用户进行提权,格式为:sudo chown [参数] 用户名 文件名 ,但同时,要想使用sudo命令,前提是当前用户在系统的信任列表中。

示例:

文件拥有者修改

(3)chgrp

功能: 修改文件或目录所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: R -> 递归修改文件或目录的所属组

同样,需要root超级用户的权限才能修改文件或目录的所属组。

示例:

文件所属组修改

(4)file

功能: 辨识文件类型
格式: file [选项] 文件或目录
常用选项:

  • c:详细显示指令执行过程,便于排错或分析程序执行的情形
  • z:尝试去解读压缩文件的内容

示例:
查看文件具体类型

(5)umask

功能: 查看或修改文件掩码
格式: umask 权限值
说明: 新建文件的起始权限为:0666;新建目录的起始权限为:0777,但实际上当我们查看我们创建的目录和文件的属性时,看到的权限往往不是上述的值。原因就在于创建文件和目录时还要受到 umask 的影响。假设起始权限是 mask ,则实际创建出来的文件的权限是:mask & (~umask) 。将文件现有的存取权限减去权限掩码后,即可产生建立文件时的预设权限。超级用户默认掩码值为:0022;普通用户默认掩码值为:0002。

示例:

权限掩码

每创建一个文件或目录,我们都可以通过 ls -l 命令来查看其相关属性。如图所示,我们创建一个新文件 file02.txt ,其默认权限为:664,那么这个权限值 664 又是怎么来的呢?这就关乎权限掩码值,通过umask命令我们查看到,作为普通用户,当前用户的默认掩码值为:0002。而新建文件的起始权限为:0666。则:

0666的二进制表示为:000 110 110 110
0002的二进制表示为:000 000 000 010
将掩码值0002按位取反有(~0002):111 111 111 101
又将0666 & (~0002)有:000 110 110 110 & 111 111 111 101 = 000 110 110 100 = 664 (最终权限值)

那么当我们通过 umask 命令将掩码值修改为 0022 ,此时再新建文件file03.txt,发现文件的默认权限值变为了 644,其相关计算如下:

起始权限0666的二进制表示为:000 110 110 110
掩码值0022的二进制表示为:000 000 010 010
将掩码值按位取反有(~0022):111 111 101 101
0666 & (~0022)有:000 110 110 110 & 111 111 101 101 = 000 110 100 100 = 644 (最终权限值)

总结:最终权限 = 起始权限 & (~umask)

2.4 目录权限(粘滞位)

可执行权限: 如果用户对目录没有可执行权限,则无法通过 cd 命令进入到目录中。
可读权限: 如果用户对目录没有可读权限,则无法通过 ls 等命令查看目录中的文件内容。
可写权限: 如果用户对目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件。

示例:

目录权限
在使用Linux的时候,通常会存在一些共享目录(由root提供),被所有普通用户所共享(即所有普通用户对该共享目录均有可读可写可执行权限),用来保存普通用户产生的一些临时数据。也就是说,所有普通用户均可在共享目录中新建文件,那同时又产生了一个问题:虽然共享目录中的文件受到权限约束,对于文件而言的其他普通用户可能无法修改文件内容,对文件进行写操作等,但由于文件处在共享目录中,虽然普通用户受到约束无法修改文件内容,但由于其还具有对共享目录的可写权限,因此,可以删除共享目录中的任意文件,即使不是该文件的所有者。 那该如何避免这种情况的发生呢?或许有人会说,那删除其他普通用户对目录的可写权限不就好了?没错,这样确实可以避免其他用户删除目录中的别的所有者的文件,但同时由于失去了可写权限,用户也无法在目录中新建文件了,这就失去了共享目录本来的意义,这个目录也就不能算是一个共享目录了。

为了合理解决上述问题,Linux引入了粘滞位的概念。

粘滞位:

通过命令 chmod (用户符号)+t 目录 即称为为目录设置粘滞位。粘滞位是针对目录而言的概念,通常需要为共享目录设置粘滞位。通过为目录设置粘滞位,可以在保证目录共享的同时防止其他用户删除共享目录中非所有者的文件。
当一个目录被设置粘滞位后,则该目录下的文件只能由:

  1. 超级管理员(root)删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除

示例:

粘滞位


总结:

  1. 目录的可执行权限表示的是用户可否在目录下执行命令。
  2. 如果用户没有对目录的 x (可执行)权限,则无法对目录执行任何命令,甚至无法通过 cd 命令进入目录,即使用户对目录仍然有 r (可读)权限。
  3. 如果用户对目录具有 x (可执行)权限,则用户可以执行命令,通过 cd 进入目录,但由于没有对目录的可读(r)权限,所以在目录下,即使可以执行 ls 命令,但仍然没有权限读出目录下的文件。

以上是我对Linux中基本权限的一些学习记录总结,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_67216978/article/details/128540226
今日推荐