Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)(上)

简介: Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)

一.shell外壳的理解

Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)",

但我们一般用户,不能直接使用kernel。

而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。

1.为什么需要有shell外壳的存在?

操作系统本身是需要易用程度和安全性的

而对于我们使用电脑的普通用户来说,我们是不能直接访问操作系统的

为什么我们不能直接访问操作系统呢?

因为对于我们绝大多数人来说,我们对于操作系统并不熟悉,如果允许我们直接访问操作系统,势必会出现一些错误,所以需要有一个中间者

2.什么是shell外壳?

这个中间者的核心工作就是

将使用者的命令翻译给核心(kernel)处理。

同时,将核心的处理结果翻译给使用者。

在Linux中这个中间者就是shell外壳

在windows中这个中间者就是图形化界面

shell外壳的本质就是一个执行起来的程序(进程),在系统启动期间一直存在

3.shell外壳的运行原理是什么?

1.当用户想要执行的指令有风险时(例如用户自定义的指令),shell都是通过创建子进程的方式去让子进程执行有风险的指令

2.对于低风险的指令,shell外壳会自己去执行

3.每一次你进行xshell登陆的时候,操作系统都要给你这个用户的当前登陆创建一个shell,bash

4.shell和bash的关系

bash时shell外壳的一种,shell外壳还有其他的一些种类,bash属于shell外壳这个集合

二.Linux中的用户权限

1.用户分类与身份切换

1.用户分类

Linux中的用户分为

1.root用户(超级管理员)

2.非root用户,也就是普通用户(xxx)

2.root用户切换为普通用户

1.su 用户名

我们现在是root用户,想要切换为普通用户wzs

执行su wzs即可

无需输入wzs用户的密码

切换后当前所处目录不变

2.su - 用户名

本质:退出root用户,以wzs用户的身份重新登陆,登陆后进入wzs用户的家目录

3.普通用户切换为root用户

1.su命令

我们当前是wzs用户,执行su命令并输入root用户的密码后切换为root用户

并且我们所处的目录不变

2.su-命令

我们当前是wzs用户,执行su -命令并输入root用户的密码后切换为root用户

所处目录更新为root用户的家目录

本质上来说就相当于退出当前用户并以root用户的身份重新登陆

4.普通用户想要切换成另一个普通用户

这些命令需要使用root用户的身份去执行

在这里我们补充一个命令:adduser 用户名:添加用户

passwd 用户名:设置该用户的密码

userdel -r 用户名:删除用户

我们在这里使用root的身份新添加了一个用户zs

并且设置了这个用户的密码

我们现在是wzs用户,想要切换为zs

我们这里以su命令为例,su zs,并且输入zs的密码才可以切换为zs

而另一种方法是:从wzs用户切换为root用户,然后再切换为zs,这个过程只需要root用户的密码,不需要zs的密码

可见root用户的密码非常强大,非常重要,那么什么样的人才会具有root密码呢?

一般是管理员

2.sudo命令

如果一个普通用户不想把自己变成root,但是还想让我自己以root的权限执行一条命令

sudo 想要执行的命令(对指定的指令进行提权)

那么这个时候就有一个问题了,

如果我们输入sudo就可以以root用户的身份执行指定的命令,那么root用户的密码不就毫无意义了吗?

答案是:不是的,因为sudo命令不是一般用户能够执行的

比方说我现在是zs,我先使用root用户的身份执行ls命令,那么我就

sudo ls

结果:被拒绝了

只有一个用户的用户名在sudoers file这个配置文件中,才允许这个用户执行sudo

否则,不允许他执行sudo命令

那么如何把某个用户的用户名添加进sudoers这个配置文件中呢?

在学完vim的时候我们会进行介绍

三.文件权限

在我们的日常生活中有各种各样的权限,所谓权限就一定是用来限制一部分人的操作的

例如:在CSDN上有一些文章只有vip才能看,leetcode上有些题是会员专属题只有会员才能做…等等等等

而且不同的应用程序或者网站场所等等都是只能提供一些特定的服务的

例如:

我们在爱奇艺当中就不能刷算法题,在leetcode中就不能看电影…等等等等

就算我们同时是爱奇艺和leetcode的会员,也无法做到这些事情

因为爱奇艺本来就无法刷算法题,leetcode本来就不能看电影

也就是说对于一些应用程序或者网站场所,它没有提供那个服务,就算我们权限是最高级别的,

也无法要求它去提供对应的服务

1.身份角色

我们前面提到过Linux中一切皆文件

那么对于某个文件来说有三种身份角色

1.文件的拥有者

2.文件的所属组

3.other

2.为什么要有所属组?

大家可能会想了,文件的拥有者和other我知道为什么要有,但是为什么要有所属组呢?

我们未来的项目开发都是团队合作的,我们的代码很有可能也是需要被团队内部所能够访问的,因此为了区分团队内部成员跟other,Linux创建了所属组这个身份角色

而对于一个文件来说最重要的就是这三个属性:

r:读属性

w:写属性

x:执行属性

我们只用wzs用户创建了一个新文件test.txt

-rw-rw-r--
这个第一个-指的是test.txt这个文件不是目录文件
第2,3,4个分别是rw-:指的是文件拥有者对于这个文件拥有读,写权限,没有执行权限
第5,6,7个分别是rw-:指的是文件所属组对于这个文件拥有读,写权限,没有执行权限
第8,9,10个分别是r--:指的是other对于这个文件拥有读权限,没有写和执行权限
• 1
• 2
• 3
• 4
• 5

文件的详细属性(样例):

跟刚才举的现实生活中的例子相同的一点:

如果一个文件本来就没有执行的属性,就算你拥有这个文件执行的权限,你也执行不了这个文件,因为这个文件本来就不是一个可执行文件

所以Linux文件如果想要能够执行:

1.必须具有可执行权限x

2.它必须真的是一个可执行程序

3.如何更改权限?

1.chmod ugoa ± rwx file

u:user(文件的拥有者)

g:group(文件的所属组)

o:other

a:all(所有人)

+:添加对应权限

-:取消对应权限

rwx:读写执行权限

file:要修改权限的文件名

这里以test.txt为例:

例如我现在想要删除所有人的所有权限

例如我现在想要增加user的rwx权限

这时test.txt对于拥有者来说具有了执行权限,但是test.txt不是一个可执行程序

所以我./test.txt去执行,没有任何反应

2.利用8进制设置文件权限

我们发现对于某个文件权限来说,这个文件权限一共有9个字符

对应到每个角色身上一共有3个字符,每个位置一共有两种状态,

一种是拥有这个权限,另一种是没有这个权限

如果我们用0来表示对应位置没有该权限,1来表示对应位置有该权限

所以我们可以用1个8进制数字来代表一个角色的权限,用3个8进制数字来代表整个文件的权限

例如:111:rwx权限都有

101:拥有r和x权限,没有w权限

所以我们可以这样去做

比方说我现在想设置test.txt的权限为:拥有者:rwx,所属组:r-x,other:—

对应到8进制表示为:750

4.root用户面前权限有作用吗?

没有作用

比方说我现在把test.txt的权限清空,转为root用户去添加内容,读取内容

丝毫没有任何约束

为了便于下面的操作,我新建了几个目录

5.chown和chgrp

那么我们来示范一下:

我现在想把这个文件给zs

但是给不了,为什么呢?

首先我们先明确一点:

那么怎么才能给他呢?

一般来说都是要用root去给,或者sudo指令提权

也就是这样:

使用root用户强制把这个文件给张三

那么能不能一起改呢?

答案是:可以的

6.own和grp一起改

比方说我想把这个文件的拥有者改成wzs,所属组改成zs

7. 匹配原则:

当一个人同时是文件的拥有者和所属组时,会先匹配他是拥有者,然后只看他作为拥有者的权限,不去看他作为所属组的权限

当我把文件的拥有者给root之后,我只是文件的所属组,那我就拥有了对于这个文件而言所属组的r权限了

四.文件类型

1.Linux中的文件类型

我们可以通过ll来查看Linux中的文件类型

我们先简单介绍一下链接文件和管道文件

1.链接文件

我们先创建一个test.c文件

然后我们gcc编译一下test.c文件,并且把生成的可执行程序a.out重命名为mycmd

然后把mycmd移动到dir/dir1/dir2/dir3的路径中

那么这个时候如果我想要在当前这个目录就能去执行mycmd,

那么我们只能

这样的话就不是很好,有点太麻烦了

这个时候链接文件就可以派上用场了

显而易见,这个链接文件就相当于我们在windows系统中创建的快捷方式

而且,在Linux中跟在windows系统中一样,删除快捷方式并不会影响到原来的可执行程序

在现在而言,我们就把它简单地理解为是快捷方式,这个链接文件我们以后还会遇到的

2.管道文件

管道文件跟我们之前介绍过的管道有非常紧密的联系,

我们可以先借助管道的作用来类比一下这个管道文件

如图,我们在第一个终端当中向管道文件mypipe中写入hello Linux.然后第一个终端就阻塞了.一直等到我们在另一个终端中接收这个hello Linux,

也就是说借助管道文件,我们就可以在两个终端之间进行信息交流了

管道文件和链接文件我们以后会详细介绍

2.Linux中的文件后缀名

Linux中的文件类型不通过后缀区分(但是:不代表Linux中后缀没有作用,后缀名还是有很大的作用的)

1.Linux中的文件类型是不通过后缀名区分的

首先,Linux中文件类型不通过后缀名区分,这个怎么理解?

首先我们用nano在test.c文件中写了一段C语言代码

无论我怎么修改这个可执行文件a.out的名字,我都是可以直接运行的

这也就说明了Linux下的文件类型是不通过后缀区分的

2.Linux中的后缀名的作用

1.Linux中的工具需要通过后缀名去区分文件类型

你不是刚才说过Linux中的文件类型是不通过后缀名区分的吗?

你现在怎么又说Linux中的工具需要通过后缀名去区分文件类型呢?

注意:Linux和Linux中的工具不是一回事

这里的Linux指的是Linux操作系统,

Linux操作系统跟Linux上面的工具,指令,编译器并不相同,也不包含

也就是说,这两句话没有任何冲突,矛盾的地方

下面给大家看一下演示:

我们把test.c重命名位test.txt,然后gcc编译,发现报错,无法编译

这也就说明了Linux中的工具需要通过后缀名去区分文件类型

2.Linux中的后缀名也是为了方便我们去进行操作

3.总结

3.file指令

file 文件名

file指令可以更加详细,直接地查看某一个文件的属性

相关文章
|
1月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
86 3
|
1月前
|
存储 Linux Windows
linux常用目录
/sbin s就是super User的意思,这里存放的是系统管理员使用的系统管理程序。 /home 存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一版该目录名是以用户的账号命名的。 /root 该目录为系统管理员,也称为超级权限者的用户主目录。 /lib 系统开机所需要最基本的动态连接共享库,其作用类似于windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。 /etc 所有的系统管理所需要的配置文件和子目录。 /usr 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program fies目录。 /bo
42 2
|
1月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
33 0
Linux 如何更改默认 Shell
|
1月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
129 3
|
1月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下文件数量是常见的需求。本文介绍了四种方法:使用 `ls` 和 `wc` 组合、`find` 命令、`tree` 命令以及编程实现(如 Python)。每种方法都附有详细说明和示例,适合不同水平的用户学习和使用。掌握这些技巧,可以有效提升系统管理和日常使用的效率。
513 6
|
1月前
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
31 1
|
1月前
|
Linux Python
Linux 中某个目录中的文件数如何查看?这篇教程分分钟教会你!
在 Linux 系统中,了解目录下的文件数量是常见的需求。本文介绍了多种方法,包括使用 `ls` 和 `wc` 命令组合、`find` 命令、`tree` 命令以及编程方式(如 Python)。无论你是新手还是有经验的用户,都能找到适合自己的方法。掌握这些技巧将提高你在 Linux 系统中的操作效率。
49 4
|
1月前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
61 2
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。