Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】

目录

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权限的概念

什么是权限呢?

  1. 权限是约束一个身份(人)的,这个人能干什么事情,取决于它的身份带给他的权限。
  2. 目标对象是否存在对应的属性给人去做。

其实权限简单来说就是------一件事情是否允许被谁做

这个谁就是人(身份),做就是这个事情本身是否能够做这个事情。

举个很简单的例子来说:

一个人能去学校上课,跟这个人没关系,是因为这个人是学生,并且学校能够提供上课属性给学生上课、

再举一个例子:

作为一个视频会员拥有者,我能看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位所表示的文件权限

  • 文件的基本访问权限
  1. 读®---Read对文件而言,具有读取文件内容的权限;对目录而言,具有浏览该目录信息的权限
  2. 写(w)---Write对文件而言,具有修改文件内容的权限;对目录而言,具有删除或移动目录内文件的权限
  3. 执行(x)---execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
  4. "---"表示不具有该权限

首先我们知道文件属性的第一位是文件类型,那为什么是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权限

总结:

  1. 目录的可执行权限是表示你可否在目录下执行命令以及进入目录
  2. 如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)
  3. 而如果目录具有-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.学习完要问自己的问题

  1. 什么是权限?

权限就是一件事情是否允许被某个身份执行

身份决定了人是否具有执行这件事情的权限,但这个事情本身是否能被执行也属于权限的一部分

具体的还是要看上面的内容

  1. 如何操作权限?

对权限进行管理,可以通过chmod对不同的身份进行权限的增加和删除。这个过程可以用字符,也可以用八进制来表示权限。

  1. 为什么要有权限?

因为可以对用户进行分类,有了权限的区别,方便我们对系统进行安全的管理和维护

  1. 文件被创建出来的默认权限是怎么决定的?

通过默认权限和umask决定的

  1. umask是什么?起什么作用?

umask是权限掩码。权限掩码实际参与了文件权限的决定

  1. umask是怎么和起始权限一起决定默认权限的?

mask & (~umask)

具体过程看2.3.2.2的拓展

  1. 进入目录需要什么权限?

x------可执行权限

  1. 为什么要存在粘滞键?

防止在同一公共目录下工作的用户对其他用户的文件进行删除

相关推荐
Komorebi.py40 分钟前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh1 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
Ajiang28247353042 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
中云DDoS CC防护蔡蔡2 小时前
微信小程序被攻击怎么选择高防产品
服务器·网络安全·微信小程序·小程序·ddos
幽兰的天空2 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
HPC_fac130520678163 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
yaoxin5211234 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin4 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----7 小时前
QT中QString类的各种使用
开发语言·qt