shell权限
1、shell相关知识
1.1、操作系统的进一步认识
操作系统,分为广义操作系统 和狭义操作系统。
广义操作系统 == 操作系统 + 应用软件。
而狭义操作系统,指的是操作系统内核。
1.2、shell简单介绍
我们有了操作系统,为什么又要有应用软件呢?
因为人是无法直接使用操作系统内核的。所以需要应用软件。
shell就是其中一个软件,它是命令行解释器。
shell的作用:接受用户指令,分析指令,交给内核执行,返回执行结果。

这就是命令提示符。
Linux系统中,为什么要存在shell外壳?
- 用户无法直接使用操作系统。
- 外壳程序可以在一定程度上拦截非法请求,变相保护了操作系统内核。
- shell通过创建子进程的方式,保护了自己。
这里有三个细节:
1、Linux用到的shell外壳程序,叫做Bash。
2、Bash是外壳程序的一种。shell外壳是命令行外壳程序的统称。
3、第三个细节
windows有没有外壳?
有!就是那些图形界面。
安卓手机用的也是Linux内核,只不过带上了外壳程序,也就是那些图形化系统。
2、Linux权限
2.1、人的权限划分
Linux将用户分成两类:
- 超级用户root
- 普通用户
创建新的用户:
adduser [name]----->passwd [name]----->输密码
以普通用户的形式登录:
^D----->ssh [用户名]@[IP]----->输密码
普通用户,不能随便干拷贝文件到/usr/bin目录下等一些越权行为。但root用户可以。
那么,普通用户怎么办?
方法一:把普通账号,变成root。但是家目录不变。

语句:su [root],然后输root的密码。
要想回来:^D。
也可以执行:su -。

这也能变成root账号,但是家目录变了,相当于root账号重新登录。
方案二:在指令前加sudo
sudo + 指令,然后输入密码,就可以提权。
既然输密码就能提权,那么root不就形同虚设了吗?
因为默认情况下,普通账号无法使用sudo。

Linux其实有一个配置文件:sudoers。这个文件相当于"白名单",只有sudoers文件里记录的用户,才能使用sudo进行指令提权。
我们将用户yzc加入sudoers文件就行了,但是添加用户这一操作必须由root账号进行。
添加指令:
vim /etc/sudoers
:set nu
i
(添加)
:wq!

2.2、文件的权限管理
我们要对权限有一个根本的认知。
权限,即规定我们能做 什么,和不能做什么。
同时,我们还要知道,我们常说的"人",其实是由角色 ,和具体的人组成的。
权限的本质,是限制角色。
Linux中,权限的角色有三类:
- 拥有者
- 所属组
- other(不属于以上两类的角色)
同时,Linux中,所有文件权限的属性有三种:
- r(可读)
- w(可写)
- x(可执行)
我们看一些文件:


由于权限属性是三个字符为一组,从左到右有三组,依次为:拥有者、所属组、other,所以,我们就可以具体地解释文件的权限。
比如,文件3_30的权限是:
- 对于拥有者,可读、可写、可执行
- 对于所属组,可读、可写、可执行
- 对于other,不可读、不可写、可执行
这样,我们对权限就有了进一步的认识。这里有两个小问题:
1、权限属性里有对于other的限制,那为什么other没有被显示标出来?
除拥有者、所属组之外的所有用户都是other(没必要标出)。
2、拥有者、所属组、other与root、yzc...的区别?前者是角色,后者是具体的人。多个具体的人,可以是某一个角色。
看到这里,也许有人有一个问题:有拥有者、other不就够了吗?为什么还要所属组?
2.2.1、所属组
我们假设只有拥有者、other。
如果有一天,我们的导师要求看看我们的代码。我们就必须对other开放"可读"权限。
这就会导致我们的竞争对手也会看到我们的代码。
为了安全性、保密性,我们就需要所属组。所属组实现了在一定范围内,实现权限管理。
用户被创建时,就属于一个同名的所属组:

我们也可以创建所属组:

然后添加组员:

划红线处表示用户yzc属于所属组yzc、project001。
2.2.2、修改权限
文件权限,分为:
- 角色
- 文件属性
我们可以修改权限。
先学习修改角色。

我们就将3_30的拥有者改为了root。

我们就将3_30的所属组改为了root。
修改拥有者:sudo chown [拥有者] [文件名]
修改所属组:sudo chgrp [所属组] [文件名]
同时修改:sudo chown [拥有者]:[所属组] [文件名]
接着学习修改文件权限属性:

我们就修改了文件3_30对于拥有者yzc的权限为:不可读、不可写、不可执行。

修改文件属性权限:sudo chmod u/g/o+(-)r/w/x [文件名]
修改文件权限属性,还有一种方法。
对于每一个角色的权限属性,要么是-(0),要么是r/w/x(1)。
我们不妨借助开关0-1的思路,用一个8进制数设置角色的权限属性:

8进制数法:sudo chmod 777 3_30
上面指令是将文件3_30改为:
- 对于拥有者:可读可写可执行
- 对于所属组:可读可写可执行
- 对于other:可读可写可执行
对于文件权限,还有三个细节。
1、普通账号受到权限的约束,但是root账号几乎不受任何限制。
普通账号:
root账号:
2、Linux中,身份匹配只会进行一次。
对文件进行操作时,系统会判断用户的身份。
- 如果身份是拥有者,就用拥有者权限
- 如果身份不是拥有者,但在所属组,就用所属组权限
- 如果身份不在所属组,就用other权限
3、x:可执行?
具有可执行权限 != 可以执行
具有可执行权限 + 是可执行文件 = 可以执行
对于文件类型的补充:
-:普通文件
d:目录文件
p:管道文件
c:字符文件
l:链接文件(相当于windows的快捷方式)
b:块设备
2.3、三个关于权限的面试题
1、进入一个目录需要什么权限?
对于目录:
- 进入一个目录,需要x可执行权限
- 读取目录中的文件内容,需要r可读权限
- 在目录下新增、删除文件,需要w可写权限
对于第三点,换句话说,文件是否可以被删除,不是由文件本身的权限决定的,而是由文件所在的上一级目录决定的。
我们可以验证这一点:
在目录4_12下,事先用root账号创建一个文件test.txt,并往里面输入内容:

然后,将test.txt的权限修改为:对于other,不可读、不可写、不可执行:

此时,yzc用户就无法读取test.txt中的内容,也无法修改
test.txt中的内容:

但是,yzc用户可以把test.txt文件删除:

因为yzc用户对于test.txt所在上一级目录,具有w可写权限:

2、什么决定了文件或者目录的默认权限?
我们创建了一个目录文件、一个普通文件,为什么一创建完,他们的目录就是这个样子?

首先,文件都有起始权限 。普通文件的起始权限是666,我们可以发现普通文件起始时没有给x可执行权限,因为给普通文件赋予可执行权限,不是主流。
目录文件的起始权限是777,因为目录是要被进入的,当然需要可执行权限。
接着,我们就要知道,Linux有一个东西叫权限掩码。

最左边的0,我们暂时不关心。从左边第二个数开始到结尾,掩码每一位的数对应的作用对象依次是:拥有者、所属组、other。
权限掩码对起始权限做处理,得到最终权限。处理方式是:
最终权限 = 起始权限 ( 按位与 ) ( ( 按位取反 ) 权限掩码 ) 最终权限=起始权限(按位与)((按位取反)权限掩码) 最终权限=起始权限(按位与)((按位取反)权限掩码)
以普通文件的起始权限:666,和权限掩码:0002为例:
cpp
权限掩码:000 000 010
按位取反:111 111 101
起始权限:110 110 110
按位与: 110 110 100
就得到了普通文件的最终权限:664。
这里我们对于权限掩码,还有三个小细节:
- 不同的系统、不同的用户,umask可能会不同。
- 不必担心umask被修改的问题,重新登陆,umask会恢复默认值。
- 批量修改文件的问题。
umask的作用之一,是能够批量创建具有指定权限的文件。

通过设置umask为077,我们创建新文件,就得到了一批对所属组和other没有赋予任何权限的文件。
3、root新建的文件,普通用户不读、不写、不执行,可以删除吗?
这个问题,上面已经回答了。
如果该文件所在上一级目录对于普通用户来说,有w写权限,那么普通用户可以删除该目录下root新建的文件。
2.4、粘滞位
我们在上面的学习中了解了文件删除的问题:用户是否可以删除文件,取决于用户是否对该文件的上一级目录具有w写权限。
那么,我们就可以很自然地想到,Linux的文件共享,就不能在任何一个用户的家目录下进行,因为共享的文件可以被该用户删除。
我们可以在根目录下,创建一个共享目录test,所有的用户都可以在这个目录下创建文件,修改内容:

共享目录,一般由root账号创建。
此时,普通用户yzc在共享目录创建了一个文件test.txt,然后设置为与另一个用户yzh共享:

与此同时,另一个用户abc,就既不能读,也不能修改test.txt:

但是,abc可以把test.txt删了:

这看起来不太合理。而实际上,abc作为other,对test.txt所在目录test具有w权限,所以abc可以删除test.txt。
这样显然是不合理的。怎么办呢?
有人说,将test目录对于other的写权限去除,那么以后其他用户就不能在test这个共享目录下新建文件了,这个方法不可行。
我们就可以使用粘滞位:


此时,用户在test下新建test.txt,与yzh共享,test.txt就不能被abc删除了:

粘滞位的出现,保证了:
- 任何人都可以在共享文件下新建文件。(不必去除目录对other的w权限)
- 用户只能删除自己创建的文件,不能删除其它用户的。
当一个目录被赋予粘滞位权限时,该目录下的文件只能被这三类人删除:
- 文件的所有者
- 该目录的所有者
- root账号(管理员)


