当前位置:   article > 正文

shell的运行原理和Linux中的权限_shell根据不同操作系统

shell根据不同操作系统

shell命令以及运行原理

Linux中的shell

image-20230107124942122我们一般称这个为命令行。输入一个命令就可以执行一个命令。那么是谁帮助执行的呢?是shell。

shell其实也是个指令,也是个程序。在linux中体现为bash程序,也就是我们常用的命令行。当我们打开云服务器时,就是自动关联bash程序

shell是外壳程序的统称。bash就是一种确定的外壳程序,是centos7下的命令行解释器

在Windows中,shell体现为图形化界面 Windows GUI

shell的运行原理

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)”。一般用户是不可以直接访问操作系统的,因为涉及安全问题。所以在操作系统的外层包裹了一层软件层,即shell,又叫外壳程序。用户可以通过这个外壳程序来与操作系统进行沟通

image-20230107130008480

在linux中外壳程序把用户的输入操作通过命令的形式收到,然后将指令传递给操作系统,操作系统处理执行完后,再将结果传给shell,最后再给用户

所以shell相当于是一个中间商的存在

shell存在的意义

  1. 操作解释。将用户的操作(即输入的命令)解释交给我们的操作系统,让操作系统去执行,执行完毕将结果经过shell返回给用户

    因此shell也叫命令行解释器

    image-20230107130203407

  2. 保护操作系统。直接在shell层就将一些无理的命令要求拒绝

    image-20230107123856958

权限

权限的概念

权限=人+事物属性

怎么理解呢?

对于人。就比如说军事基地,军官就能去,普通人就不能去,这就是权限

对于事物属性。比如说你想在爱奇艺视频网站敲代码,由于爱奇艺视频网站这个事物本身不具备敲代码的功能,所以你想在爱奇艺视频网站敲代码是不可能的

Linux上的用户

Linux上用户分为两类:

  • 一类是root,超级管理员。几乎拥有一切权限,几乎可以干任何事情
  • 一类是普通用户,很多事情受权限约束

用户间的切换

从普通用户切换成root用户,指令:su

示例:image-20230107183932226

这里要输入的密码是root的密码,不是你这个普通用户设置的密码

另外还有一个指令:su -

susu -的区别在于:su是在切换身份后还处在之前的目录下;而su -则是让root重新登陆,即回到最开始的目录下

image-20230107192027007

image-20230107192059336

此外:

  • 两个普通用户之间是无法进行身份切换的,除非知道密码
  • 普通用户无法随意进出root,除非知道密码
  • root用户,可以随意进出普通用户,不需要密码

用户访问权限

现在,我是一个普通用户image-20230107144547727

想访问test.txt,但权限不够,被拒绝了。当然我们可以切换身份为root去看。不过就为了这个去大费周章太麻烦。所以我们可以用sudo对这个指令进行提权

语法:sudo 指令 文件

image-20230107144714440

这里输入的密码是当前用户的密码,不再是root的密码

这是为什么呢?

这里涉及将当前用户添加到root的信任列表,后面再讲

如果你给指令前带上sudo,执行这个指令的并不是以你的身份执行的,而是以root的身份执行的

我们通过一个例子来理解上面这句话:

image-20230107154025780

Linux的文件属性

当我们在命令行输入ls -l后,我们可以看到文件的如下信息:

image-20230107204806378

image-20230107203808041

下面将详细介绍文件的属性

文件类型

Linux下不用文件后缀区分文件类型,而是用文件属性中第一列的第一个字符来区分文件类型

常见文件类型:

d:目录

-:普通文件。如文本文件、可执行文件、归档文件

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如硬盘、光驱等)

p:管道文件

c:字符设备文件(例如屏幕等串口设备)

s:套接口文件

那该如何看待后缀呢?

关于文件后缀
  • 你想用就用,可以给别人看
  • 将后缀看成文件名的一部分

这里说的linux下不用文件后缀区分文件类型,说的是操作系统。而像gcc这样的软件是需要后缀的!!!

举个例子:

我写了一段代码,并由gcc生成了可执行文件image-20230107205411219

我们./a.out是可以执行该文件的。将a.out改成a.exe或者改成a.txt,都是可以执行的image-20230107205808798

但当把test.c改成test.txt后,gcc test.txt却报错了image-20230107205900956

所以说系统不关心文件后缀,不代表操作该文件的软件不关心

Windows下的操作系统是需要后缀来区分文件的

Windows下是根据不同的后缀来调用程序的

而Linux下是你用户来指明用哪些程序来访问某些文件的

文件访问者的分类

  1. 文件拥有者:这个文件是谁的
  2. 其他用户(other):这个文件不是谁的
  3. 文件所属组:所属组内有多个用户,这些用户都拥有文件的权限。

也就是文件的拥有者,你想让哪些用户看你的文件,你就将那些用户添加到所属组中

这里的文件访问者和上面的用户并不冲突。

image-20230107150410903

人都会扮演很多角色

文件权限

文件权限读、写、执行

image-20230107210449441

表示文件权限的字符共九个,每三个为一组。每组中的每个字符的位置的所表示的权限是确定的:第一个代表可不可读,第二个代表可不可写,第三个代表可不可执行

- 表示没有对应位置的权限

r 表示可读

w 表示可写

x 表示可执行

举例:

image-20230107210657283

首先这是个普通文件。拥有者可读可写不可执行;所属组可读可写不可执行;其他用户可读不可写不可执行

为什么这里都不可执行呢?因为文件属性本身就不可执行,所以也就没有可执行的权限

完整描述一个文件的权限:拥有者的权限+所属组的权限+other的权限+拥有者是谁+所属组是谁

更改文件权限

一般是这个文件的拥有者或者是root才可以更改文件权限

第一种指令(ugo+rwx)

更改文件的指令:chmod 权限所属对象+/-权限 文件名

+代表是增加权限,-代表是删除权限

权限所属对象:

  • u 代表拥有者
  • g 代表所属组
  • o 代表其他人

权限:

  • r 代表可读
  • w 代表可写
  • x 代表可执行

示例:image-20230107211446957

简便写法:

  • 对一个访问者同时增加或删除多个权限

    image-20230107211704760

  • 对多个访问者同时修改权限

    image-20230107211829015

    多个访问者之间逗号连接

  • 所有访问者同时改变同一种权限

    image-20230107212019870

    a代表所有访问者

第二种指令(八进制方案)

文件权限的表示一共九个字符,每三个一组。权限要么是有,要么就没有,所以我们可以用二进制来表示有没有该项权限

以rw-rw-r–为例,对应的二进制就是:110 110 100,再转换为八进制就是664

所以可以用如下指令来更改权限:chmod 八进制数 文件名

例如:

  • image-20230107212246785

    777换成二进制就是111 111 111,也就是权限全开

  • image-20230107212325749

    同理,这是权限全关

文件的拥有者与所属组

文件的拥有者和所属组是可以更改的。

但一般只有root才可以随意更改文件的拥有者和所属组,如果普通用户也想更改,需要使用sudo

更改拥有者

语法:chown 新拥有者 文件

image-20230107154659274

image-20230107154713540

更改所属组

语法:chgrp 新所属组 文件

image-20230107154814446

image-20230107154822064

同时更改拥有者和所属组

image-20230107154954598

image-20230107155002337

这是同时改变拥有者和所属组

权限存在的意义

image-20230107220704149

由上图可知:尽管这个文件的拥有者是我自己,但由于我没有权限,我自己也无法访问

image-20230107220818956

但假如是root呢?尽管root在这里来说属于其他用户,按理来说也没有任何权限的。但root是超级用户,它可以无视权限,直接访问

所以说:权限是用来限制普通用户的,root是超级用户

目录的权限

  • 可执行权限: 如果目录没有可执行权限, 则无法cd到目录中
  • 可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
  • 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件

image-20230108192109896

image-20230108192237957

image-20230108192338885

默认权限

为什么我们创建普通文件权限默认是664(即不包括可执行)?,创建的目录默认权限是775?

image-20230108173432895

这里就涉及到了起始权限与最终权限

起始权限与最终权限

一个文件有两种权限,一个是起始权限,在创建文件之处系统设定的;另一个是最终权限,也就是你看到的默认权限

新建文件的起始权限是666,新建目录的起始权限是777

实际上是0666,0777。但第一位我们不去看,以后再说

那么系统为了更好的控制权限,在起始权限变成最终权限这之中,设置了权限掩码(可用umask指令查看)

权限掩码:在起始权限中,去掉umask中出现的权限,且不能影响其他任何权限

最终权限=起始权限&(~umask)

具体说明:

就看新建文件,起始权限666,变为二进制是110 110 110

普通用户的umask是002,变为二进制是000 000 010,再~后是111 111 101

两者按位与得:110 110 100,即664

umask指令

功能:查看或修改权限掩码

语法:umask (权限掩码)

如果umask后面带了三个八进制位数据,则表示将权限掩码修改为此

超级用户默认掩码值为0022,普通用户默认为0002

image-20230108192856604

粘滞位

背景:在使用Linux的时候,未来可能会有一些共享目录被所有普通用户共享,用来保存普通用户产生的临时数据

准备:这个共享目录通常是由root提供的

问题:当我把文件给所有人共享的时候,文件的访问者是受权限约束的(比如说设置权限其他用户只能读)。但是拦不住别人删我的文件!!这很不合理!!

解决措施:给共享目录添加粘滞位

只能给目录添加粘滞位

而且只能是root进行添加

指令chmod +t 共享目录

image-20230108193626412

image-20230108193640859

image-20230108193651166

设置完粘滞位后,在共享目录下只有文件拥有者和root才能删自己的文件

当然,目录的所有者也能删,不过一般共享目录的所有者就是root

此外,这里有两个问题:

  1. 为什么文件共享时拦不住别人删我的文件
  2. 为什么只能给目录添加粘滞位

回答:

  1. 能否删一个文件不是由文件的权限决定的,而是由该文件所处的目录权限决定,目录具有w权限,即可删除。但同时w权限也决定了能否创建新文件。共享目录为了满足普通用户在该目录下创建权限的需求,将w权限放开,因此普通用户也获得了删文件的权限。所以粘滞位的作用就体现了
  2. 因为文件被删的原因是由于目录权限导致的,所以就给目录添加粘滞位
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/307621
推荐阅读
相关标签
  

闽ICP备14008679号