目录
[4.1 修改文件的权限](#4.1 修改文件的权限)
[4.1.1 修改拥有者权限](#4.1.1 修改拥有者权限)
[4.1.2 修改所属组权限](#4.1.2 修改所属组权限)
[4.1.3 修改other权限](#4.1.3 修改other权限)
[4.1.4 修改所有权限](#4.1.4 修改所有权限)
[4.2 重点部分](#4.2 重点部分)
[4.2.1 能改任何人的文件权限嘛?](#4.2.1 能改任何人的文件权限嘛?)
[4.2.2 没有权限怎么办?](#4.2.2 没有权限怎么办?)
[4.2.3 确定权限信息的时候,系统会先确定用户是谁](#4.2.3 确定权限信息的时候,系统会先确定用户是谁)
[4.2.4 root用户的权限是什么?](#4.2.4 root用户的权限是什么?)
[4.2.5 如何理解可执行](#4.2.5 如何理解可执行)
[4.3 修改文件的拥有者,所属组](#4.3 修改文件的拥有者,所属组)
[4.3.1 修改文件的拥有者](#4.3.1 修改文件的拥有者)
[4.3.2 修改文件的所属组](#4.3.2 修改文件的所属组)
[4.3.3 使用chown修改拥有者和所属组](#4.3.3 使用chown修改拥有者和所属组)
[4.4 使用8进制来修改文件权限](#4.4 使用8进制来修改文件权限)
[5.1 如果我想进入一个目录,需要什么权限?](#5.1 如果我想进入一个目录,需要什么权限?)
[5.2 r权限对目录意味着什么?](#5.2 r权限对目录意味着什么?)
[5.3 w权限对目录意味着什么?](#5.3 w权限对目录意味着什么?)
[5.4 root不受目录权限约束](#5.4 root不受目录权限约束)
[5.5 总结](#5.5 总结)
[8.1 一个现象](#8.1 一个现象)
[8.2 两个用户进行文件级别的协作](#8.2 两个用户进行文件级别的协作)
一、linux权限的概念
Linux下有两种用户:超级用户(root) 、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
超级用户的命令提示符是"#",普通用户的命令提示符是"$"。
**命令:**su [用户名]
**功能:**切换用户。
例如,要从root用户切换到普通用户user,则使用su user。
要从普通用户user切换到root用户则使用su root(root可以省略),此时系统会提示输入root用户的口令。
从普通用户到超级用户:su
从超级用户到普通用户:su user
退回到刚才的用户 :exit /或者ctrl+d
su切换成超级用户和su -切换成超级用户的区别:su:su不会让root重新登陆,只是身份的切换,最直观的表现是不影响当前的工作目录
su -:它是让我们以root的身份重新登陆了,重新登陆会导致工作目录发生变化
如下所示:
新建用户,如下所示:
二、使用sudo给指令短暂提权
使用:安装软件,安装到系统中,需要管理员root权限。
使用sudo之前需要在设置一下,系统默认不让普通用户执行sudo指令,如果允许所有用户执行sudo,那岂不是所有的用户都是root了嘛?
如下所示:我们现在是用户zx,执行sudo ls会不让我们执行。

系统里面有一个类似白名单的东西,如果这个用户在这个白名单中,这个用户就可以使用sudo进行短暂提权。
在白名单里面增加zx,让zx可以使用sudo进行短暂提权
1:首先切换为root用户
2:查看ll /etc/sudoers root有没有写的权限,如果没有就使用chmod u+w /etc/sudoers
3:使用vim /etc/sudoers 编辑
4:在root下面加上以下代码
5:按 :wq!退出
6:使用sudo,切换到zx用户
以超级管理员的身份创建一个文件,如下所示:
三、linux权限管理
权限是什么?
权限的本质:能或者不能做什么事情
为什么要有权限?
控制用户的行为,防止错误发生
1:权限首先限制的是角色(用户)
2:权限要求目标必须具备对应的属性:比如说,我今天要访问一个文件,而对应的文件天然的对于任何人都没有写属性,所以即便是普通账号还是特权账号,这个文件都不让你写入,这就说明,如果这个文件不具备某一种属性,那么你也就不会有对应的某种权限。
3:权限=角色+目标权限属性
在linux系统下,一切都是文件,文件只有三种属性,读,写,执行
角色:在linux系统下,有三种角色1:拥有者
2:所属组
3:other
我们使用ll来查看文件的属性,如下所示:
root,zx,zhangsan vs 拥有者 ,所属组,other
具体的人 角色
所以一个文件的拥有者和所属组通常是有对应的角色的,而这样的角色是需要具体的人来扮演的,换言之,比如root,有可能是一个文件的拥有者,也有可能是文件的所属组或者other。两者不仅没有冲突,而且是相互补充的。
在ll查看文件的详细属性中,第二列是拥有者,第三列是所属组,那为什么不见other呢?
答案是:other不需要记录下来,如果一个用户既不是拥有者,也不是所属组,那么他就是other了。
什么是所属组呢?
所属组是很多用户组成的组,也可以自己成立组。
文件属性:我们使用ll来查看文件的属性,如下所示:
对于任何一种文件来说,属性只有三种,r:读;w:写;x:可执行。
我们描述文件的权限的时候,往往会说这个文件的拥有者具备什么权限,这个文件的所属组具备什么权限。
是要把角色和目标文件属性信息结合起来,去表述,才能表述清楚一个完整的权限概念。
所以,对于任何一个文件来讲,它有三种角色(拥有者,所属组,other),有三种属性(读,写和可执行)。因此这个文件的属性是什么呢?
在ll所显示的详细属性之中,第一列的第一个字符表示的是文件类型,后面九个字符表示文件的权限,三个三个为一组。每一个都有rwx属性(-表示没有该属性),对应的角色就是拥有者,所属组,other。以my.txt为例,如下所示:
权限描述:my.txt对于拥有者zx来说,可读,可以写,但是不可以执行;对于所属组zx来说,可读,可以写,但是不可以执行;对于other来说,可读,不可以写,不可以执行;
四、linux权限修改
权限=角色+目标属性,那我们修改权限修改的是什么呢?
修改权限:要么就是修改文件的角色,拥有者,所属组和other,要么角色修改文件的目标属性。
权限的修改就是围绕这两掉展开的。
4.1 修改文件的权限
修改文件的权限使用chmod指令。
chmod命令权限值的格式:
- 用户表示符+/-/=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
4.1.1 修改拥有者权限

4.1.2 修改所属组权限

4.1.3 修改other权限

4.1.4 修改所有权限


4.2 重点部分
4.2.1 能改任何人的文件权限嘛?
我们在刚刚修改文件权限的时候,这个文件是用户zx的,本来就是属于我的,我改我自己的文件属性是很正常的。
我们使用sudo 创建一个root用户的文件,我现在是用户zx,我现在能修改root创建的文件权限嘛?
如下所示:

我现在是用户zx,修改root.txt的权限被拒绝了。
所以关于文件权限,用户只能修改自己的文件权限,不能修改别人的文件权限。
如果非要修改呢?可以把自己切换成为root,或者使用sudo暂时提高权限
4.2.2 没有权限怎么办?
我们现在是用户zx,对这个文件具有读和写的权限,我们可以使用echo和cat来往my.txt来写入内容和读取文件里面的内容,如下所示:

如果我们将所有者的rw权限给去掉呢?如下所示:

当所有者zx没有rw权限,就不能读和写这个文件。
当用户没有相应的权限,系统会拒绝让我们访问。
4.2.3 确定权限信息的时候,系统会先确定用户是谁
现在有一个问题,我现在是文件的所有者,去掉了rw权限,不能读和写。但是不要忘记了,我们不仅是文件的所有者,还是文件的所属组啊。所属组不是有rw权限嘛?为什么还是不能读和写呢?
这是因为系统在确定权限信息的时候,系统会先确定用户是谁?拥有者,所属组还是other。
在Ubuntu下,用户角色确定,只会确定一次,顺序是:拥有者,所属组还是other。
确定了用户角色之后,就只看对应的权限。
4.2.4 root用户的权限是什么?
我们切换为root角色之后,root既不是文件的拥有者,也不是文件的所属组,root对于这个文件来说是other,如下所示:

other应该只有读的权限,为什么root还能使用echo往文件里面写呢?
更过分的是,root还能直接把这个文件给拿走,如下所示:

root不受权限的约束,因此权限只是来限制普通用户的,不能限制超级管理员。
4.2.5 如何理解可执行
我们给my.txt加上可执行权限,然后执行这个文件,如下所示:

我们给文件拥有者zx加上可执行的权限,但是为什么还是执行不了呢?正常情况下不是应该可以执行嘛?
我们要理解一个点:可执行权限!=文件可执行
我们加了可执行权限,只是允许这个文件将来可以被执行,但是不代表这个文件本身就是一个可执行程序。只有用户拥有可执行权限,并且这个文件可以被执行,两种结合才能真正的执行。
4.3 修改文件的拥有者,所属组
chown
功能:修改文件的拥有者
格式:chown 用户名 文件名
chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R递归修改文件或目录的所属组
不需要修改other,只要你不是拥有者或者所属组,你就是other。
4.3.1 修改文件的拥有者
我现在是用户zx,我想要把我自己的文件my.txt给root和zhangsan,这个操作都不被允许。如下所示:

我们想把这个文件给别人,但是系统默认不允许我们把文件给别人的。
如果我们想给别人,必须使用sudo暂时提高权限。如下所示:

4.3.2 修改文件的所属组
修改文件所属组也是同样的道理,如下所示:

4.3.3 使用chown修改拥有者和所属组

4.4 使用8进制来修改文件权限
我们在上面谈到一个文件的权限的时候,如下所示:

对应的权限只能是r/-;w/-;x/-。我们发现这些状态都是两态的。我们就可以把这个文件的权限当成1/0。1表示有对应的权限,0表示没有对应的权限。就可以使用3个比特位来表示能否读写和执行。
对于所有者zx:比特位就是110;
对于所属组zx:比特位就是110;
对于other:比特位就是100;
二进制对用户不友好,就可以转换为664;所以我们在表示权限的时候也可以表示为664;这个就是权限的8进制表示方案。
我们也可以使用8进制来修改文件的权限,如下所示:

五、目录的权限如何理解?
我们刚刚修改的都是普通文件的权限问题,那目录的权限如何理解呢?
5.1 如果我想进入一个目录,需要什么权限?

上面的例子说明,进入一个目录和读权限没有半毛钱关系。因为我们把读权限给去掉了,照样可以进去和退出来。
那进入目录需要的是写权限嘛?如下所示:

上面的例子也同样证明了:进入一个目录和写权限没有任何关系。
那进入目录需要的是可执行权限嘛?如下所示:


上面的例子证明了:进入一个目录需要可执行权限!!
5.2 r权限对目录意味着什么?

如果对目录没有读权限,就无法查看目录里面的文件。
5.3 w权限对目录意味着什么?

如果对目录没有写权限,就无法在目录里面创建文件
5.4 root不受目录权限约束

上面例子展示了,我们将拥有者,所属组和other的权限都去掉,我们就无法进入这个目录,无法查看这个目录,无法在这个目录里面创建文件。
但是root权限不受影响,如下所示:

5.5 总结
- 如果对目录没有可执行权限,就无法进入这个目录
- 如果对目录没有读权限,就无法查看目录里面的文件
- 如果对目录没有写权限,就无法在目录里面创建文件
- root不受权限影响
默认情况下,我们新建一个目录,rwx权限都要有。
六、理解linux多用户之间是怎么互相"隔离"的
在linux系统里面,每新建一个普通账号,就都会在home目录下新建一个以特定用户名命名的文件夹。将来,用户每次登陆的时候,就都会进入对应的目录。如下所示:

在home目录下面,other的权限为0,这就意味着,任何用户,无法进入其他用户的家目录!更别说读和写了。因此用户之间,在基于权限方面,就可以实现多用户直接的隔离。

七、缺省权限
我在linux系统下新建一个文件和目录,那他们对于的权限是什么呢?如下所示:

为什么建立文件和目录是这个样子的?
对于普通文件来讲:起始权限为666 对应rw-rw-rw-。默认不带可执行
对于目录文件来讲:起始权限为777 对应rwxrwxrwx。
那为什么和上面的权限不一样呢?
是因为,在linux系统中,存在一个叫做权限掩码的概念,如下所示:

第一个0不考虑,只用看最后三个比特位就可以了。
最终形成的权限=起始权限&(~umask)
1:umask的目的是什么:
希望凡是在umask中出现的权限,都不应该在最终权限中出现。
2:为什么要有umask?
a:默认权限,由OS自主决定,无法在创建之前进行修改---系统可配置,可以灵活满足需要的一种表现。
b:特殊情况下,配置umask,可以控制文件的默认权限,让我们的代码都是可控的。
3:如何修改umask?

八、多个用户之间如何交互呢?
8.1 一个现象
首先,我们来看一个现象。
我们以root的权限创建一个root.txt,然后将权限设置为000,所以用户zx无法查看,修改,执行这个文件。这些都是符合我们的预期的。但是,用户zx能删除嘛?如下所示:

我们以用户zx的身份,成功的删除了超级管理员root所创建的文件。
一个用户不能写,不能读别人的文件,竟然可以删除这个文件,这是为什么呢?
这是因为,这个用户zx是这个lesson5的拥有者,对目录具有写权限,这就意味着用户zx能够在这个目录新建文件和删除文件。
一个文件能否被删除,与文件本身无关。和文件所处目录的w权限有关!!
你先不要问我,为什么能删除你root的文件。你能不能解释为什么你的文件会出现在我的文件夹里面。我的文件夹,我有写权限,所以能够删除这个文件。
一个文件能读能写能执行是由这个文件自身所决定的。但文件默认能不能被删除,并不由你自己决定,而由文件所处的目录决定。
8.2 两个用户进行文件级别的协作
上面刚刚说过,任何用户无法进入别人的家目录,但是如果现在有某一种情况,两个人想要共同修改或者查看一个文件,那怎么办呢?
首先,这个要协作的文件,不能放在一个私人用户的目录里面。如果放在用户zx的家目录里面,其他人就都访问不了了。
那么应该放在哪里呢?在根目录下面不止一个home目录,还有很多其他目录,我们可以把需要协作的文件放到一个目录下面。
我们使用root的身份在根目录/下新建一个temp_share目录,然后修改other的权限,让他们可以读,写和可执行,如下所示:

为什么要使用sudo进行指令提权来新建文件?
这是因为/目录是属于root的,其他人没有写权限,不能再根目录下创建文件和删除文件。
我们给temp_share目录的other加上w权限,所有的用户就都可以再这个文件夹里面查看,修改文件了。所有人就都能共享这个文件了。
如下所示:我们现在是用户zx,可以进入目录,创建文件。

我们现在切换到张三用户,访问这个share_data.txt文件,如下所示:

用户zx再temp_share目录下创建了一个shared_data.txt文件,我们切换为zhangsan用户后,进入这个目录下,可以查看这个文件。
但是用户zhangsan是不能写的,因为shared_data.txt文件的拥有者和所属组是zx,zhangsan是other,只有r读权限,如果我们想让zhangsan可以w写,我们可以切换到zx,修改这个文件other权限就可以了,如下所示:

现在zhangsan可以读写用户zx所创建的共享文件shared_data.txt。但是用户张三可以删除zx创建的这个文件嘛?如下所示:

我们看上面的命令,可以发现用户张三可以删除这个文件,这是为什么呢?
这是因为 **一个文件能否被删除,与文件本身无关。和文件所处目录的w权限有关!!**zhangsan是这个共享目录的other,other身份对这个文件具有rwx权限,只要用户对这个w权限,就可以再这个目录里面删除和创建文件。
如果zhangsan可以删除这个共享文件,那么lisi是不是也可以删除这个共享文件呢?答案是肯定的。
所以现在就有一个需求:共享类文件,不想让非文件的拥有者删对应的文件!!!
那能不能把共享目录下other的w权限给去掉呢?如果把other的w权限给去掉,所有用户就都不能再这个共享目录下创建文件了,就失去了共享的意义了。所以w不能去掉。
因此,就有了一个悖论了:我们想要共享文件,首先在共享目录里面能新建文件,就需要w权限,然后有了w权限之后呢,其他的用户也有了w权限,就可以在这个共享目录下删除文件了,我们不想让其他人删除这个文件,可是其他人删除文件的权限,和在目录里面创建文件的权限是一样的。
因此现在的需求就是:任何一个人都可以在共享目录下新建文件,但是不能让非文件的拥有者删对应的文件!!!那怎么办呢?
所以linux系统里面引入了一个新的权限标记位:t,也被叫做粘滞位。如下所示:

我们给这个共享目录加上t权限之后,zhangsan就不能删除由zx所创建的文件了。
因此粘滞位t的功能就是:让我们在一个共享目录下,不会让非文件拥有者删除对应的文件!!
只能给共享目录上加t权限。
当一个目录被设置为"粘滞位"(用chmod+t),则该目录下的文件只能由
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
我们需要文件共享的时候,需要自己建立共享文件然后加t权限嘛?其实是不用的,在根目录下,有一个tmp目录,它默认自带了t权限,我们可以将需要共享的文件放到这个tem目录下,如下所示:







