Linux权限理解
- shell外壳运行原理
- 为什么我们不是直接访问操作系统?
- 外壳程序的意义
- 权限的概念与操作
- 用户的权限
- 如何进行Linux下用户身份的切换?
- 角色和文件的权限
- 权限是什么?
- Linux中文件的类型是如何被确定的?
- 权限与角色的关系
- 权限与文件属性的关系
- 如何操作权限?
- 关于文件属性的权限操作
- 关于角色的权限操作
- 常见权限问题
shell外壳运行原理
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的外壳程序shell,来与kernel进行沟通。
为什么我们不是直接访问操作系统?
如果让用户直接访问操作系统有两方面的问题:
- 操作成本特别高
- 人会犯错,从而带来不安全问题
对于Windows下的图形化界面和Linux下的指令操作其实都是操作系统提供的外壳程序。
外壳程序的意义
- 是用户和操作系统交互的中间软件层
- 外壳程序将用户的命令翻译给kernel处理
- 同时将kernel处理的结果翻译给使用者
- 可以在一定程度上起到保护操作系统的作用
查看自己的外壳程序:
这里bash
是shell外壳程序的一种。
权限的概念与操作
用户的权限
Linux是一个多用户操作系统,可以同时存在多个用户。
Linux下的用户可以分成两类:
1. root用户(只有一个)
具有Linux下的最高权限,一般都不会以受到权限的约束。
2. 普通用户(可以有多个)
会受到权限的约束。
其实,Linux系统下对于root用户和普通用户的切换,就是对权限的切换。
如何进行Linux下用户身份的切换?
- 普通用户到root用户的切换:
- root用户到普通用户的切换:
如果是从普通用户切换到root用户的情况下,可以直接ctrl + d
切换到之前登录的普通用户。
也可以通过su 用户名
来从root用户切换到普通用户。
角色和文件的权限
权限是什么?
由Linux下一切皆文件的思想,我们谈论的也将会是文件的权限。
概括来说,Linux下的权限是指一件事情是否允许被角色“做”。
这涉及到两个核心方面:角色和文件属性。
Linux中文件的类型是如何被确定的?
Linux不像Windows系统,以文件后缀来区分文件类型。
常见的文件类型有:
d
:目录
-
:普通文件
p
:管道文件
b
:块设备(如磁盘设备)
c
:字符设备(如键盘或显示器设备)
l
:链接文件
…
虽然从系统层面上来说文件后缀没有什么意义,但是文件后缀可以方便使用者的查看。
但是,有时候我们会遇到像下面这样关于文件后缀的问题:
而这里要说明的是,我们所说的不以文件后缀来区分文件类型,是在Linux系统环境的层面来说的。而gcc是Linux环境上安装的一个软件,至于这些软件对文件后缀有没有要求,那就是这些软件的规定了。
权限与角色的关系
Linux将用户身份划分为三类角色:文件拥有者,文件所属组,other(不属于前两种的都是other)。
文件所属组的存在可以使文件实现组内管理。
权限与文件属性的关系
如何操作权限?
对权限的操作分为两个方面:对角色的操作和对文件属性的操作。
关于文件属性的权限操作
-
对单角色文件属性的权限操作:
-
对多角色文件属性的权限操作:
-
八进制下对文件属性的权限操作:
因为三种角色中任意一种角色,对一个文件都对应有rwx
三种操作权限,而每一种操作权限只分为有和没有两种状态,所以每一种角色对一个文件的权限操作的状态就有8( 2 3 2^3 23)种,可以使用8进制数进行对应表示。因为是三种角色,自然就由3个8进制数来进行对一个文件的权限状态的表示。
至于ugo+-
和8进制这两种对文件权限状态的操作方式,自己想用哪个就用哪个呗。 -
文件属性对权限操作的影响
上面的例子中,虽然文件是属于当前角色的,但是角色却不能对它做任何操作。
举个形象的例子,就像过年时收到的红包是你的,但是被父母收起来了,你就没有了对红包的使用权限。
在root用户下,几乎可以无视文件权限对操作的影响。
如上面例子中,root虽然属于other角色,但是依旧可以对文件读写,可以认为是开挂的存在 ,这也说明了root用户和普通用户是有区别的。
关于角色的权限操作
常见权限问题
- 进入一个目录,需要什么权限?
这种情况下,以文件拥有者的角色来看,没有对目录的任何操作权限。
以文件所属组的角色来看,是有读写和执行的权限的。
而此时cd
命令被拒绝了,说明此时使用的是文件拥有者的角色。
事实上,如果已经是文件拥有者了,那就只会看文件拥有者所对应的权限,和文件所属组的角色没有关系。
如果不是文件拥有者,而是文件所属组的角色,那么也会只看文件所属组角色所对应的权限。
这就是所谓的权限只会被认证一次。
从上面过程可以看出,进入一个目录需要的是x
权限。 rw
权限是限制了目录的什么呢?
r
:限制查看目录下的文件
w
:限制在目录下创建或删除文件- 创建一个目录或文件时,它的权限是如何被赋予的?
其实创建一个目录的起始权限是777
(rwxrwxrwx),创建一个普通文件的起始权限是666
(rw-rw-rw-)。
但我们看到的最终权限却有一些不一样,这是因为权限掩码(umask)的作用。
这里要记住凡是umask中出现的权限,都不能在最终权限中出现。
从起始权限到最终权限有一个换算的过程:最终权限=起始权限&(~umask)
。
以起始权限777
为例进行如下换算:
同理,起始权限666
经过换算可以得到最终权限是664
。
权限掩码(umask)其实是可以被修改的。
被修改之后,新建目录或普通文件经过换算的最终权限自然也会受到相应的变化。 - 粘滞位的使用
假如有一个公共的目录mytemp
,所有人都可以在里面存放文件。
虽然在这个公共目录里面,我们也许对别人的文件没有任何操作权限,但我们却可以将别人的文件删除。
至于为什么能将别人的文件删除,那是因为在目录下,新建或删除文件,只是和目录是否给了写的权限有关。
如果想要既保持在目录下创建删除文件的权限,又不至于对别人的文件具有随意删除的危险,这里就可以使用粘滞位了。
因为有了粘滞位的作用,再在公共目录下删除别人的文件时操作就被限制了。
这里再说明一下粘滞位只能给目录设置,一般是谁设置的谁才能取消(root权限也能取消)。