目录
文件访问权限的设置和更改
粘滞位
权限掩码
本期我们接着进行Linux权限的学习。
在上期我们学习了文件的访问权限,这些访问权限其实是可以更改的。
chmod指令:用于设置访问权限和更改权限。
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:所属组
o:其它用户
a:所有用户
注意:只有文件的拥有者和root管理员才能对文件不同用户的访问权限进行修改。
实例如下:
1.增加拥有者对test2.c文件的执行权限:
2.取消所属组对test2.c文件的写权限:
3.增加其他人对文件test2.c的写权限和执行权限
4.取消拥有者,所属组,其他人对文件test1.c的所有访问权限
5.增加拥有者,所属组,其他人对文件test1.c的所有访问权限
除了上述增加权限的方式之外,还有一种通过八进制数更改权限的方法:
我们知道,读写执行这三个访问权限有两种状态,要么具有权限要么不具有权限,所以我们可以将具有相关权限设置成0,不具有相关权限设置成1,总共三个权限,每种权限有两种状态,即二进制,三个权限组合总共有8种状态,刚好可以用一个八进制数表示(0-7)。
通过一个例子我们可以更清楚的认识上述的八进制更改权限的方法:
1.增加所有用户对test2.c的所有权限:
chown指令:更改文件的拥有者
注意:通过上代码我们发现,普通用户不能更改文件的拥有者,只有root用户可以更改文件的拥有者。
chgrp指令:更改文件的所属组
注意:通过上述代码我们发现,普通用户是不能直接更改文件的所属组,只有root管理员可以,但是当管理员将所属组信息更改之后,我们可以让普通用户,将更改后的所属组改回文件本身的所属组。这一点需要额外注意。
如果我们要进入一个目录,需要什么权限呢?
这里直接给出结论,如果我们要进入一个目录,必须要拥有对这个目录的执行权限--x。
通过上述代码不难发现,我们要进入一个目录,必须具有对这个目录的执行权限。
如果没有执行权限,虽然也能显示一些信息,但只能显示这个目录下的文件的文件名称属性,其它属性都是不可以查看的。
我们再来看看如果具有了执行权限我们访问一个目录时是怎样的:
拥有了执行权限之后,可以访问目录的全部文件属性。
什么是粘滞位,通过字面意思可能我们无法理解,我们通过一个例子为大家讲解:
比如我们创建了一个目录p1,这个目录的拥有者和所属组都是root,我们让这个目录的其它用户具有了写(w)的权限,并在该目录下创建了四个文件:
因为其它用户对该目录具有写权限,所以其它用户yjd,可以在该目录下创建文件:
既然其他用户对这个目录具有写权限,那么自然就可以删除这个目录下的文件:
我们发现,虽然被删除的文件在被删除时受w权限的保护,但是我们仍然可以删除掉,那么此时就存在了一种情况,用户1在具有对当前目录的写权限,所以就可以在当前目录下面添加文件,此时来了个用户2,那么此时他肯定也可以在当前目录下添加和删除文件,此时就会导致一种情况用户2在创建自己的文件时,可能会删除掉用户1的文件,那么此时用户1不就是白创建文件了吗?怎样解决这种问题呢?
此时我们便引入了粘滞位的概念,粘滞位就是为了使对某个目录具有写权限的其他用户在当前目录中创建文件时,禁止当前用户删除其他用户所创建的文件。对某一目录添加了粘滞位之后,在该目录下,只有文件拥有者和root可以删除文件,其他用户均不可以删除文件。
粘滞位指令:chmod o+t 目录名
我们发现此时其他用户yjd对目录p1中的文件不能再删除。
在Linux中的/tmp目录是一个存储临时文件的目录,这个目录会存储其他用户所创建的大量的临时文件,同时为了防止这些文件被删除丢失,这个目录的权限中也用到了粘滞位。
不知道大家有没有注意到,当我们在Linux中创建文件时的创建出来的文件的权限,我们可以在linux中创建文件验证:
普通用户创建:
我们称:
目录所有用户整体权限的八进制表示为:775
普通文件所有用户的整体权限的八进制表示为:664
root用户创建:
我们称:
目录的所有用户的整体权限的八进制表示为:755
普通文件的所有用户的整体权限的八进制表示为:644
为什么在普通用户和root用户中创建的文件和目录的权限是不相同的呢?
其实无论是创建的目录还是文件,它们都是有初始权限的,目录的初始权限是777,普通文件的初始权限是666。
那么为什么我们创建出来的目录和文件的初始权限不是777和666呢?
这就是因为了权限掩码的存在,权限掩码就是为了让目录和文件的权限成为用户所需要的权限,所设置的一套掩码,查看掩码的指令是:umask。
普通用户的权限掩码为:0002
root用户的权限掩码为:0022
那么权限掩码究竟是怎样把文件和目录的默认权限变成用户想要的文件和目录权限的呢?
因为我们知道每个用户的每个权限都是由一个二进制位表示的,3个用户总共有9个权限,总共九个二进制位,权限掩码的第一位不用考虑,剩余的3位都是由3位二进制组成的八进制,所以总共也有9个二进制位,注意此时的运算方法:我们先将权限掩码的每一位按位取反,取反之后然后与目录或者文件的三个用户的所有权限的9个二进制位进行按位与,按位与得到的结果就是每个用户的每个权限的结果。
举个例子:因为目录的初始权限为777:二进制表示为 111111111
文件的初始权限为666:二进制表示为 110110110
对于普通用户:权限掩码为0002, 除去第一位表示为000000010,按位取反为111111101。
与目录初始权限按位与得到的二进制位为:111111101,转为八进制为:775
与文件初始权限按位与得到的二进制位为:110110100,转为八进制为:664
对于root用户也是同理的。
这便是为什么我们以普通用户和root用户在创建目录和文件时,创建出来的目录和文件的权限是我们看到的样子的原因。
以上便是权限相关所有的知识点了,内容比较多且比较复杂,对于某些指令大家可以下去多多练习。本期内容到此结束^_^