shell相关知识与Linux权限

shell权限

1、shell相关知识

1.1、操作系统的进一步认识

操作系统,分为广义操作系统狭义操作系统

广义操作系统 == 操作系统 + 应用软件。

而狭义操作系统,指的是操作系统内核

1.2、shell简单介绍

我们有了操作系统,为什么又要有应用软件呢?

因为人是无法直接使用操作系统内核的。所以需要应用软件。

shell就是其中一个软件,它是命令行解释器。

shell的作用:接受用户指令,分析指令,交给内核执行,返回执行结果。

这就是命令提示符。

Linux系统中,为什么要存在shell外壳?

  1. 用户无法直接使用操作系统。
  2. 外壳程序可以在一定程度上拦截非法请求,变相保护了操作系统内核。
  3. 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。

这里我们对于权限掩码,还有三个小细节:

  1. 不同的系统、不同的用户,umask可能会不同。
  2. 不必担心umask被修改的问题,重新登陆,umask会恢复默认值。
  3. 批量修改文件的问题。
    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删除了:

粘滞位的出现,保证了:

  1. 任何人都可以在共享文件下新建文件。(不必去除目录对other的w权限)
  2. 用户只能删除自己创建的文件,不能删除其它用户的。

当一个目录被赋予粘滞位权限时,该目录下的文件只能被这三类人删除:

  • 文件的所有者
  • 该目录的所有者
  • root账号(管理员)
相关推荐
SPC的存折2 小时前
3、主从复制实现同步数据过滤
linux·运维·服务器
SPC的存折2 小时前
openEuler 24.03 MariaDB Galera 集群部署指南(cz)
linux·运维·服务器·数据库·mysql
SPC的存折2 小时前
MySQL 8.0 分库分表
linux·运维·服务器·数据库·mysql
cyber_两只龙宝2 小时前
【Oracle】Oracle之DQL中WHERE限制条件查询
linux·运维·数据库·云原生·oracle
22信通小白3 小时前
USRP初学者使用手册(基础配置及bug记录)——Linux+Clion(单台X310收发)
linux·运维·c++·5g·bug·信息与通信
网络安全许木3 小时前
自学渗透测试第14天(信息收集进阶与指纹识别)
linux·网络安全·渗透测试
xlq223223 小时前
40.线程控制
linux
TechMasterPlus4 小时前
Linux U-Boot 与内核启动流程深度解析:从上电到 Shell 的完整之旅
linux·运维·服务器
大白菜和MySQL4 小时前
Linux下dhcp服务搭建
linux·运维·服务器