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账号(管理员)
相关推荐
A小辣椒15 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒19 小时前
TShark:基础知识
linux
AlfredZhao21 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言