目录
Linux权限理解
在学习linux的权限之前我们先来看看我们一直使用的Xshell是如何运行的。
1.Xshell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)" ,但我们一般用户,不能直接使用kernel。而是通过kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)
(shell是外壳的统称,我的服务器(Centos 7)的linux系统的外壳是bash【shell有很多种,bash只是其中一种,还有一些linux系统用的外壳是sh】)
我的所有指令都会交给bash这个shell来处理
shell会干两件事情:
-
将使用者的命令翻译给核心(kernel)处理。
-
同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
看图可以方便理解:
其实用户也不是不能和操作系统交互,但是比较麻烦,不方便。
注意:
这里还有一个小概念,就是如果用户输入的指令/程序会让shell出问题的话,shell就会通过派生子进程的方式去执行用户的指令,shell本身不会执行用户的指令。这样子进程挂了,shell本身不会有问题。这里的详细细节以后会学习
2.linux权限的学习
linux是一个多用户操作系统,因此权限的学习非常重要
2.1linux权限的切换
Linux下有两种用户:超级用户(root)、普通用户
- 超级用户:可以在linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情
超级用户的命令提示符是"#",普通用户的命令提示符是"$"
如何切换呢?
命令:su[用户名]
例如:要从root用户切换到普通用户user,则使用 su user。并且不用user的密码, 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令,输入root的密码
如果我想用普通权限,用root权限调用一个命令,但是我不切换成root身份的话,需要用sudo。
sudo就是普通用户不切换身份的同时又能以root的身份去执行sudo后面的指令。
这个时候系统会让你输入用户的密码
这里我们会发现好像有一点问题,**普通用户以root的身份去执行指令,但是输入的是自己的密码?**这岂不是说所有普通用户都能以root身份执行指令吗?
实际上不是这样的。当我们输入完密码的时候会发现
这里的意思就是说,Yaj这个用户是不被系统信任的,它不能借用root的身份去执行指令
实际上,如果一个用户能执行sudo的话,说明他是被系统信任的用户。这个需要用户存在于/etc/sudoers
这个目录下。这个东西有点类似白名单------给受信任的用户,提供最少的执行障碍
2.2linux权限的概念
什么是权限呢?
- 权限是约束一个身份(人)的,这个人能干什么事情,取决于它的身份带给他的权限。
- 目标对象是否存在对应的属性给人去做。
其实权限简单来说就是------一件事情是否允许被谁做。
这个谁就是人(身份),做就是这个事情本身是否能够做这个事情。
举个很简单的例子来说:
一个人能去学校上课,跟这个人没关系,是因为这个人是学生,并且学校能够提供上课属性给学生上课、
再举一个例子:
作为一个视频会员拥有者,我能看vip电影是因为我的会员身份,跟我人这个体是没有关系的,我说我是谁谁谁,系统不认,它只认你是否是会员。是会员,才能拥有会员的权限。
linux当中的文件权限==角色/身份+文件属性
假如我是root身份/用户,那我就会拥有root身份/用户的权限,但是某个文件的属性本身就是不可以访问的,(比如一个不是可执行的文件)那么即便我拥有root的权限,但是我还是无法访问这个文件。如下图所示
但是一个文件的属性是------只能被root用户查看,那么root用户就可以访问这个文件,普通用户就不行。这里体现的就是权限对人(身份)的约束。
2.3linux权限管理
2.3.1linux中文件访问者的分类
linux在判断一个具体用户的权限的时候,会先将这个具体的用户分类,分类完之后根据身份去给与相对应的权限。
具体在linux中,会将用户分类成三类身份。
- 文件和文件目录的所有者:u---User(中国平民 法律问题)
谁创建的文件和文件目录,谁就是所有者------user
拥有者只能是一个具体的用户。
- 文件和文件目录的所有者所在的组的用户:g---Group(不多说)
user和other的概念都很好理解,这个group怎么看呢?
所属组group的存在能解决一个问题------一个文件只能给拥有者(user)查看或者给全部人(other)查看
举个例子:一个项目,有A\B两个组的人去一起开发,谁开发的好用谁的。一个A组的人想把自己的代码给组内的伙伴查看,如果没有group,它直接放开了other的权限,那么所有人都可以来看他的代码,这样就不合理了
- 其它用户:o---Others (外国人)
除了user和group的其他人就是others。
2.3.2文件类型和访问权限(文件属性)
2.3.2.1文件类型
我们要如何查看文件的类型和权限呢?
输入ll就行了,文件名前面的一长串就是这个文件的属性
关于这个文件属性如何看,我们可以看下面这个图。
我们先来看文件属性第一位所表示的文件类型:
- 文件的类型
要注意:在linux中文件后缀对于linux区分这个文件的类型完全无关。在linux中,文件后缀本质也是文件名字的一部分。但是作为用户来说,我可以通过后缀去帮助我区别文件类型.
d:文件夹
-:普通文件(源代码,库文件,可执行程序,文档压缩包等)
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)【这个删除了就出问题了】
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
我们也可以通过file来查看文件类型
file 文件名
2.3.2.2文件权限
知道了文件类型之后,我们再来看文件属性第2~10位所表示的文件权限
- 文件的基本访问权限
- 读®---Read对文件而言,具有读取文件内容的权限;对目录而言,具有浏览该目录信息的权限
- 写(w)---Write对文件而言,具有修改文件内容的权限;对目录而言,具有删除或移动目录内文件的权限
- 执行(x)---execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- "---"表示不具有该权限
首先我们知道文件属性的第一位是文件类型,那为什么是9位来表示文件的权限呢?
因为是每三位为一组来表示对应身份所拥有的权限。
我们以上图file这个文件的属性为例来解析一下其第2~10位所表达的文件权限
因此我们要描述file这个文件的属性我们应该这样说:file这个文件的类型是目录,它的拥有者是root,所属组是root,对于拥有者来说它的权限是可读可写可执行,对于所属组来说,它的权限是可读不可写可执行。对于其他人来说,它的权限是可读不可写可执行。
下图是三位权限的各种情况:
字符表示法:
8进制数值表示法:
拓展---文件的起始权限
我们创建一个普通文件,它创建出来的权限如下图所示:
这里有个问题:为什么普通文件的创建出来的权限是644?
这里需要引入一个权限掩码(umask的概念)
umask
功能:
查看或修改文件掩码
-
新建文件夹默认权限=0666
-
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & (~umask)
格式:umask 权限值
说明:将现有的存取权限去掉权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002
实例如下图所示
这里创建了一个普通文件test.txt和目录dir
注意,这里默认权限去掉权限掩码的运算过程不是减法,是mask & (~umask) 。
也就是**(默认权限的二进制码)&( 按位取反的权限掩码的二进制码)**
什么意思呢?
如图所示:
这样做的目的就是:
umask:默认要去掉的权限位是1,要保留的是0
~umask:要去掉的权限位就变成0,任何数&上0都是0,从而实现去掉权限,要保留的权限位就是1,如果本来就有这个权限,那么1&1还是1,从而实现权限的保留
2.3.3文件权限管理
知道了文件属性当中是如何表达文件权限的。现在就可以学习如何管理文件权限了、
要想对文件权限进行修改,要不就是root用户,要不就是文件的所有者。
要对文件权限进行管理,需要用到指令chmod:
chmod
**功能:**设置文件的访问权限
**格式:**chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
用chmod来管理权限的格式:
用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
实例:
我们以下面这个文件为例子,来对其权限进行管理/修改。
我们想把user的权限修改成不可读不可写,输入chmod u-rw test.txt
这里的这个u指的就是user的权限,-代表删除权限,u-rw就是删除user的可读可写权限。u-rw test.txt就是删除user对test.txt这个文件的可读可写权限
把user的权限修改为可读可写可执行,输入chmod u+rwx test.txt
这里虽然我们把拥有者的权限修改为可读可写可执行,但是并不是一定就能执行出结果。这个文件本身没有可执行内容,即便执行了也不会有结果
如上图所示,执行了没有反应。说明这个文件本身不应该是可执行的
修改用户组和其他人的权限也是类似,把相应的u改成g和o就行了
如果想一次性去除多个身份的相同权限也是可以做到的,在中间加个逗号就可以了。
意思就是去除拥有者和用户组的所有权限。
一次性同时管理多个用户的不同权限也可以,如下图所示:
也可以通过-a选项来一次性修改所有身份的权限
当然,也可以用8进制表示法来修改文件的权限:
例如下图:
这里的第一个7表示的是修改拥有者的权限,7等价于u+rwx,即可读可写可执行
这里第二个7表示修改的是所属组的权限,等价于g+rwx,即可读可写可执行
第三个0表示修改其他人的权限,等价于o-rwx,即不可读不可写不可执行
在把权限改回去
2.3.4文件权限的应用
现在我们已经能对一个文件的权限进行管理了。那不同身份下的各种权限到底有什么区别呢?使用的时候是什么样子的?我们来看下面这个例子:
这里是使用者是否拥有各种权限的例子:
这里test.txt的文件对user的权限是rw-,也就是可读可写不可执行。
因此下图我们也对文件内容进行修改和读取的时候没有问题,在执行的时候报错显示Permission denied,意思就是没有权限。
因为这个文件本身的属性不提供可执行权限给你,即便是root权限也没办法执行。
root权限是不受约束的,我们看下图:
即便test.txt的对拥有者的权限是不可读不可写的,但是root仍然可读可写、
这里有个例子要注意:
这里有个普通账户whb,有个普通文件test.txt,这个文件对拥有者的权限是仅可读,对用户组的权限是可读可写。
但是我们实际操作却发现,whb这个用户在对text.txt写的时候,发生了没有权限的事情。
这里可能有个问题:明明whb也是用户组里面的,虽然你对拥有者的权限是不可写,但是whb是用户组的呀,用户组的权限是可写的,那为什么没有权限呢?
这是因为linux底层再对你的用户权限进行匹配的时候,是从左到右进行匹配的,并且是if else,如果匹配到你是拥有者,那么就匹配拥有者的权限,除非你不是拥有者,才去判断你是不是用户组。
2.3.5文件访问者的管理
chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
实例:
将f1这个文件的拥有者改成user1
# chown user1 f1
递归修改filegroup1这个目录下的文件的拥有者,都改成user1。
# chown -R user1 filegroup1
要注意:
如果不是root权限去执行这个指令的话,将拥有者改为user1,需要经过user1的同意才可以。
chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
实例:
将f1文件的所属组改为user1
# chgrp user1 f1
递归修改filegroup1这个目录下的文件的所属组,都改成user1。
# chgrp -R user1 filegroup1
要注意:
如果不是root权限去执行这个指令的话,将所属组改为user1,也需要经过user1的同意才可以。
并且用chown也可以修改所属组,如下图所示:
其他人ohers不存在修改的指令。因为拥有者,和所属组,都是具体的人,但是其他人指除了所有者和所属者的其他所有用户。
2.4目录的权限问题
目录的权限:
-
可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
-
可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
-
可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
面试题:
1.进入一个目录要什么权限?
需要x------可执行权限
2.为什么linux规定目录的起始权限是777?
因为任何一个目录被创建出来都需要能够被进入,也就是x权限
总结:
- 目录的可执行权限是表示你可否在目录下执行命令以及进入目录
- 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
- 而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,无法浏览目录下的文件
2.5粘滞位
在讲述粘滞位之前,我们先要讲述一个基本事实:
Linux是一个多用户服务器,有些时候一些特定的场景下,多个用户需要在一个公共的目录下,进行临时文件的操作。
这个公共的目录是/tmp------往往这个公共目录是root用户创建的,因此对于这个公共目录来说,其他所有用户都是others
这目录里会放置一些临时文件
知道了这个基本事实的话,我们来看一个场景:
前面我们学过目录的权限,我们知道,一个用户只要具有目录的写权限,那么就可以在目录内进行文件的创建和删除,如下图所示:
**但是这里就有一个问题:**我们在同一个公共目录下工作,因此我肯定具有目录的写权限,但是我对其他用户创建的文件不一定会有写权限,但是我却可以直接删掉别人的文件!
换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限。因为删除文件这个权限不是由文件的w权限决定的,是由目录的w权限决定的。
这样就不合理了。
因此linux为了解决这个问题,就引入了粘滞键这个概念。粘滞位本身是权限的一种特殊情况。
是目录的权限问题导致公共目录内部的用户可以互相删除文件,因此我们给公共目录本身去设置一个粘滞位,从而达到禁止文件被其他用户删除的情况
2.5.1添加粘滞位
粘滞位------给目录设置的一种权限
注意:要有root权限才可以执行这个指令。并且root不受粘滞位影响,不受权限约束
chmod +t /公共目录名
这里给目录添加粘滞位,实际上就是在对others的权限做一个特殊化处理,把others的权限从rwx改成了rwt、因为其他所有用户对于公共目录来说都是others。
如下图所示:
others的权限变成了rwt就是粘滞键添加成功了。
3.学习完要问自己的问题
- 什么是权限?
权限就是一件事情是否允许被某个身份执行
身份决定了人是否具有执行这件事情的权限,但这个事情本身是否能被执行也属于权限的一部分
具体的还是要看上面的内容
- 如何操作权限?
对权限进行管理,可以通过chmod对不同的身份进行权限的增加和删除。这个过程可以用字符,也可以用八进制来表示权限。
- 为什么要有权限?
因为可以对用户进行分类,有了权限的区别,方便我们对系统进行安全的管理和维护
- 文件被创建出来的默认权限是怎么决定的?
通过默认权限和umask决定的
- umask是什么?起什么作用?
umask是权限掩码。权限掩码实际参与了文件权限的决定
- umask是怎么和起始权限一起决定默认权限的?
mask & (~umask)
具体过程看2.3.2.2的拓展
- 进入目录需要什么权限?
x------可执行权限
- 为什么要存在粘滞键?
防止在同一公共目录下工作的用户对其他用户的文件进行删除