创作初心:在加深个人对知识系统理解的同时希望可以帮助到更多需要的同学
🛠️柯一梦主页详情
座右铭:心向深耕,不问阶序;汗沃其根,花自满枝
常见的热键和使用的技巧:
-
Tab\]按键---具有命令补全功能
-
Ctrl\]-r按键---进入搜索模式,可以使用关键词搜索历史指令
shell命令及其运行原理:
Linux严格意义上是一个操作系统,我们称之为核心(kernel),但是一般的用户不能直接使用kernel,而是通过一个外壳程序shell,来与kernel进行沟通。如何理解呢?
从技术角度来说,shell的最简单的定义:命令解释器,主要包含:
- 将使用者的命令翻译给核心kernel处理
- 同时将核心处理的结果翻译给使用者
对比Windows GUI:我们操作Windows,不是直接操作Windows的内核,而是通过图形化接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常双击D盘盘符,或者运行起来一个应用程序)
shell对于Linux:有相同的作用,主要是对我们的命令进行解析,解析指令给Linux内核。反馈结果再通过内核运行出结果,通过shell解析给用户。
帮助理解:如果说你是一个害羞且闷骚的程序员(也就是用户),你喜欢上了村头漂亮的小花(也就是操作系统内核),媒婆就是shell外壳。你喜欢小花,但是你狠害羞,不能和小花知己诶的进行面对面的交流,所以你就让媒婆给你去提亲,所有的事情你都和媒婆进行沟通,然后媒婆再把你的消息传递给小花,王婆是众多媒婆中的一员,我们叫她王婆(bash)。
总结:因为内核太过复杂,所以给内核套上了一个外壳,也就是外壳程序,shell命令行,图形化界面,我们通过外壳与内核进行交流,内核返回出来的信息又通过外壳传递给使用者。这样用户无法直接访问内核的方式就可以变相的保护内核。
Linux权限的概念
什么叫做权限?
就是能不能访问资源
为什么要有权限呢?
因为Linux操作系统是多用户操作系统,一个Linux同时会有多个用户来访问登录,权限的本质就是为了更好的进行用户管理
权限 = 人 + 文件属性
权限是针对特殊群体的,与人的身份有关(比如root和普通用户)
Linux下的两种用户
- 超级用户:可以在Linux系统下面做任何事情并且不受限制
- 普通用户:可以在Linux下做有限的事情
- 超级用户的提示符是"#",普通用户的提示符是"$"
切换用户的指令:su
使用方法: su [用户名]
从超级用户切换到普通用户:直接su 用户名
从普通用户切换到超级用户:su root(root可以省略),此时系统会提示输入root用户的密码。
从普通用户切换到另一个普通用户:系统户要求你输入该用户的密码
值得一提的是:你使用su切换用户的时候,并不会改变当前的工作路径,所以su 用户名更像是"临时借用身份",会保留原有的工作上下文。如果你想要改变工作路径,你可以使用su - 用户名,这样的话可以起到"重新登陆的效果",会彻底改变工作环境。
Linux的权限管理
注意:权限是依附于角色的,角色是由用户(分为超级用户和普通用户)扮演的
1.linux中的角色
- 文件和文件目录的拥有者:u
- 文件和文件目录的所有者所在的组的用户:g (设立组就是为了方便问价内进行组级别的管理)
- 其他用户:o
注意:超级用户可以在linux系统下进行任何操作,具有特权,可以无视文件的权限,即使是作为other角色,也可以任意的访问文件
2.文件类型和访问权限
我们在创建文件的时候,登录在那个用户下面,创建的文件的拥有者就是谁,如果我们想创建文件到系统上面,我们该怎么办呢?只能使用sudo,使用完sudo以后可以短暂的提权(拥有了和root一样的特权),值得一提的是,我们在使用完sudo以后,要输入的却是该用户的密码,那么这哈斯有就有同学要问:那root不就形如虚设吗?其实不是这样的,在操作系统中,不是所有用户都可以使用sudo命令,这个需要root进行指定(在指定的配置文件中进行操作)
文件类型:
- d:文件夹
- -:普通文件
- l:软连接
- b:块设备文件(如硬盘、光盘)
- p:管道文件
- c:字符设备文件
- s:套接口文件
基本权限:我们随机显示一个文件的属性
从左往右,第一列代表的是文件类型,往后的每三列为一组,每一组里面又按顺序分为三个字母,分别是r w x
- r:对于文件而言,具有读取文件内容的权限;对于目录而言,具有浏览该目录信息的权限
- w:对于文件而言,具有修改文件内容的权限;对于目录而言,具有删除、移动目录内文件的权限
- x:对于文件而言,具有执行文件的权限,对于目录而言,具有进入目录的权限
文件权限值的表示方法
- 字符表示方法(也就是r w x)
- 8进制数值表示方法,为什么是八进制呢?(一个角色具有三个位,也就是000-111,就是0-7,所以一个角色对应的权限就是0-7,比如100就代表拥有者可以执行该文件,而其他人无趣权限)
文件访问权限的相关命令
chmod指令(change mode)
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项:
- R:递归修改目录文件权限
- 注意:只有文件的拥有者或超级用户才可以更改文件的权限
chmod命令权限值的格式:
通过 "对象 + 操作 + 权限" 的组合修改权限
-
操作符:
=
:设置权限(直接覆盖原有权限,只保留指定权限)-
:移除权限(原有权限不变,删除指定权限)+
:添加权限(原有权限不变,新增指定权限)
-
用户符号:
u
:所有者(User,文件 / 目录的创建者)g
:所属组(Group,文件 / 目录归属的用户组)o
:其他用户(Others,既不是所有者也不在所属组的用户)a
:所有用户(All,等价于u+g+o
)
实例:
chmod使用字符改变文件的属性

chmod使用八进制数字改变文件属性

值得注意的三个细节:
1.用户在对文件的属性进行修改时,系统会先匹配用户对于文件的角色,在匹配过程中,遵循只匹配一次且从左往右,也就是说如果一个文件的所有者和所属组都是rxj,所有者没有修改权限,即使所属组有修改权限,rxj也不能进行修改
2.关于文件的可执行,不仅需要文件有执行的权限,而且还需要文件本身是可执行的二进制文件
3.关于文件权限的修改,一般是拥有者进行的修改
chowm指令
功能:修改文件的拥有者(只有超级用户才有修改文件所有者的资格,因为你不能随便把一个文件甩锅给别人)
格式:chown 参数 用户名 文件名
常见参数:
- -R:可以递归更改一个目录下的所有文件的属性
实例:

chgrp指令
功能:修改文件的所属组
格式:chgrp 参数 用户组名 文件名
参数:
- -R:递归修改文件或目录的所属组
实例:

值得一提的是:
文件的拥有者不能直接修改文件的拥有者和所属组
如果是一个错误代码,就会影响别人
如果你想要给别人:
1.使用超级用户
2.使用sudo进行短期的提升权限
四个问题:
1.文件权限问题:进入一个目录需要什么权限呢?是 r 还是 w 还是 x?
首先我们可以先引入一个不是很准确的概念,那就是目录也是一个文件。众所周知,文件=文件内容+文件属性,r,x,w指令控制的是用户对文件内容的权限。如果说目录是一个文件,我们可以把文件的属性看成一个目录下面的内容。
r:控制的是用户能不能看见目录下面的内容,也就是文件的属性,例如文件名,文件权限什么的

w:控制的是用户能不能往目录下写东西,也就是创建或者删除文件

x:控制的是用户是否可以进入目录

注意:我们在进行一些指令的时候,要分清我们在对谁进行指令,比如touch,mkdir,cd都是在对目录进行操作,那么这些命令会受到目录的权限约束,而像cat则是在对文件进行操作,则不会受到目录约束
2.为什么我们创建的文件和目录权限是我们看到的那样的呢?
对于普通文件来说,文件的起始权限是从666开始的(因为默认文件不需要可执行)
对于目录文件来说,文件的起始权限是从777开始的
但是为什么我们打开文件权限不是这样的呢?
原因就是我们在创建文件或者目录的时候还会受到umask的影响,实际创建出来的文件权限是:初始权限&~umask
umask指令
功能:
- 查看或者修改文件掩码
格式:umask
举例:

我们创建一个文件,我们就会发现这个文件其他用户的写权限被删除了,因为其实的掩码值就是其他用户有写权限,按位取反再按位与之后,那个权限就被掩盖了,所以实际权限并不是初始权限和掩码的简单相加减

3.一个不能写不能读的文件我们可以删除吗?
但是可以的,因为删除文件时你操作的对象是目录,而不是那个文件本身的属性,在指定目录下,即使是超级用户创建了一个不可读、不可写、不可执行的文件,我们照样可以删除
4.如何和多用户共享文件呢?
首先我们要知道一个点,如果我们想要共享文件,我们只能建立在系统级的目录底下,因为如果是其他用户的家目录,我们连进都进不去。 所以你只能使用sudo短期提高命令权限,把目录创建在系统目录下。
但是里有一个问题,为了让第三方使用这个目录,那么所有人都可以在这个目录下面增删,万一被其他的第三方使用者删除了怎么办呢?
粘滞位
超级用户使用chmod +t给目标目录添加上粘滞位,指定的目录被添加粘滞位之后,只能添加文件,但不能删除
补充:其实每个系统级下都有一个叫tmp的共享文件的目录,他是自带粘滞位的
当一个目录被设置粘滞位以后
- 超级用户删除
- 目录的所有者删除(一般是超级用户)
- 文件的所有者删除(一般是超级用户)