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. 为什么要存在粘滞键?

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

相关推荐
小蜗牛慢慢爬行几秒前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
秋名山小桃子3 分钟前
Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决
运维·服务器
与君共勉121384 分钟前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
Algorithm157610 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭10 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
努力学习的小廉11 分钟前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
MZWeiei14 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
shinelord明20 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2126 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu27 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa