Hi!我是Duoni!
目录
一、Shell命令及运行原理
Shell是什么?
能否绕开Shell调用操作系统
Shell外壳程序的意义
查看外壳程序
浅解杂谈
二、权限
Linux系统下的两种用户
用户切换
用户权限与文件权限的关系
文件权限的认识
三、权限操作
如何进行文件权限操作
权限遐想
如何修改文件拥有者
普通用户怎么修改文件拥有者
root用户怎么修改文件拥有者身份
other能不能修改?
四、常见权限问题 (面试问题与细节问题)
目录权限
umask掩码
粘滞位
提到Shell,可能名字无比陌生,但在Linux系统中,我们的操作时刻离不开它。
在生活角度打个比方:
Linux操作系统好比一本晦涩难懂的外文名著,但我们又想要从中吸收到点营养,怎么办呢?这时候如果使用翻译软件或许是不二选择,所以Shell外壳工具就好比那翻译软件,使我们能对它了解一二。
Linux操作系统是一个十分庞大且复杂的结构,我们要操作它,必须要借助Shell(命令解释器),使用它接收我们的指令再反馈给Linux核心进行处理,Linux又将执行结果反馈给Shell程序,最后,Shell再把执行结果对我们可视化的进行展现。
再看,windows中的图形操作界面(Windows GUI)也可以称为Shell“外壳”程序,我们的每一次点击都由图形操作界面接收,再反馈给windows系统处理。总结:Shell就是帮助我们与操作系统建立交互的一个媒介。
答案是可以的
Shell程序是为我们便利性的提供帮助,并不是与操作系统连接的唯一通道。但我们要想直接调用操作系统是难度巨大的。
试想着操作系统管理着电脑上大大小小的硬件,进而根据用户指令再实现大大小小的功能。
就拿音响播放功能为例:
我们直接调用操作系统势必得先找到音响硬件的物理地址,再进行二进制的指令操作,但事实是:除了操作系统知道物理地址在何处外,无人知晓。所以直接使用操作系统是困难的。
尚且,操作系统出于安全、稳定性考虑,也不希望你直接对它进行操作。
1、外壳程序是用户与操作系统交互的中间软件层。
2、外壳程序在一定程度上起到了保护操作系统的作用。
(体现在:如果用户有意或无意下达对操作系统有损的指令,外壳程序会主动阻断。)
在Xshell中,我们输入指令:echo $BASH。就可以查看我们所使用的外壳程序。
输入:bash -al,可查看外壳程序子程序及文件。
1、外壳程序其实有点像我们所写的死循环程序,不断地循环读取指令,循环处理指令。
2、Shell外壳程序其实是一切外壳程序的统称。
(比如:黄豆、黑豆、荷兰豆,都是豆类)
Linux系统中,权限的作用在于划分不同用户的可操作范围。
就好比:群主、管理员可以进行踢人等核心操作,而群成员只能进行发言等常规操作。
1、超级用户(root):可以在Linux系统下操作所有的可执行项,做任何事情。系统下root用户只能有一个(群主)。
2、普通用户(user):只可以操作权限允许内的部分操作,被限制。系统下可以有多个普通用户(群成员)。
超级用户的指令提示符是:'#'
普通用户的指令提示符是:'$'
用户切换指令:su
指令功能:对Linux系统下已存在的用户进行切换。
1、超级用户切换指令:su -
2、普通用户切换指令:su[name]->(name为用户名)
附:如果你是root用户,那么你可以切换名下所有的普通用户,且不需要验证密码。但如果普通用户想要切换成root或user用户,则需要进行密码验证(对方用户)。
权限的大小依托于用户的类型,但用户对文件的操作也依托与文件的基本属性。
打个比方:
假如你是超级用户,你想要文件播放在线电影,但文件并没有这个功能,所以你的要求并不会被实现,尽管你是超级用户。
tips:为什么是文件属性呢?
因为在Linux系统下,一切皆文件!
附:什么是文件权限呢?
其实这个概念是文件属性的抽象化,就是文件内部是否有达成用户某一指令的基本条件(功能)。
小结:了解完二者的关系后,我们可以总结为:权限 = 人(用户)+ 文件属性。
输入指令:ll,显示当前用户下的所有文件。
在解析文件权限前,我们再结合以上小结,知道了权限是由:人与文件属性共同构成的,那么这里的人具体能细分为哪些类型呢?
如展开图:
第二大列是:拥有者,就是哪一个用户下创建的,属于谁。
第三大列是:所属组,所谓的组,也可以理解为“群”,每一个拥有者(用户)都可以建立组,而组内可以添加多个用户,协同操作。
其次是:other(其他),如果此用户既不是拥有者,也不是所属组成员,那么就可以称他为other,这一项系统不展示。
系统下不会记录other,但其会分辨在用户进行文件操作时,他的身份是否属于拥有者或所属组,如果不是,那么便可判定是other。
接下来,我们再回过头看文件属性,与人(用户)所对应的关系。
文件显示的第一列第一个字符表示文件的类型。
tips:
(1)、Linux系统下不以文件后缀表示文件类型。(例:file.txt)
(2)、'-'表示普通文件,'d'表示目录文件,'p'管道文件,'c'字符文件。
这一段字符串中,第一列表示文件类型,后面三列分别为:拥有者(owner)、所属组(grp)、other,每个都对应着三个字符。
这三个字符分别为:'r'、'w'、'x',对应着“读、写、执行”三个权限。
1、'r'表示文件中读的权限,若存在'r'字符,即说明可被读,为'-'则反之。
2、'w'表示文件中写的权限,若存在'w'字符,即说明可写,为'-'则反之。
3、'x'表示文件中执行的权限,若存在'r'字符,即说明可被执行,为'-'则反之。
比如:
第一个文件类型为:普通文件。拥有者能够读写文件,但不能执行文件;所属组能够读文件,不可以写、执行文件;other能够读文件,不可以写、执行文件。
熟悉完文件属性及人(用户)的三种类型后,我们能够知道,权限的构成是二者紧密联系而实现的,能够形成灵活的权限分配。
使用指令:chmod (操作对象)+or-(指定权限)
指令功能:对不同用户类型进行添加或删除权限
演示:
当前路径下创建一个名为:bat.txt的普通文件。
此时它的类型是普通文件,拥有者为:root,所属组为:root;拥有者有读写权限,没有执行权限;所属组与other有读权限,没有写与执行权限。
现在我要给所属组添加一个写文件的权限,输入指令:chmod g+w bat.txt
此时,所属组便有了写文件的权限。
那么此时要删除拥有者的读权限,并添加other的执行权限要怎么做?
输入指令:chmod u-r,o+x bat.txt
修改权限完毕。
tips:
1、三个用户类型简写为“u(拥有者)、 g(所属组)、o(other)”。
2、若要添加权限,则‘+’对应权限,否则反之。
3、如果要给所有用户类型都添加或删除权限,则这么操作:chmod a(+or-)rwx bat.txt,其中'a'代表all全部的意思。
1、若文件中所有权限都被关闭,root用户能够进行操作吗?
试验:
将bat.txt文件中的所有用户类型的权限都关闭。
输入指令:chmod a-rwx bat.txt
此时权限已经被全部关闭
使用root用户在bat.txt文件写入“Hello Linux”,并进行访问。
事实证明,root用户能够无视权限束缚,但普通用户不能如此。
指令:sudo chown(拥有者) XXX(目标用户) bat.txt
功能:更改拥有者
注意:此操作必须要在root权限下执行,否则会报错。
普通用户要想修改拥有者身份,必须要由root用户将其提升权限,将普通用户加入系统信任名单中,之后再使用sudo指令即可。
输入指令: chown XXX(目标用户) bat.txt。
附:修改所属组也是相同。(chgrp->修改所属组)
答案是:不能
原因:1、无法确定谁是other。
2、对拥有者与所属组进行修改后,自然会发生变化。
这里有一道面试题:
若要进入一个目录,那么需要什么权限?
A、'r'
B、'w'
C、'x'
答案是:C
目录权限解析:
(1)、目录权限'x':若没有执行权限,则无法使用cd(访问)目录;
(2)、目录权限'r':若没有读权限,则无法使用ls查看目录中的文件;
(3)、目录权限'w':若没有写权限,就无法使用touch与rm在目录中创建或删除文件。
附:如何知道自己在文件中的所属身份及对应权限呢?
首先你要判断文件信息的第二与第三大列,你是否是拥有者或是所属组,若都不是那就是other。
接下来再判断自己在文件内的权限:9个字符,以三种身份划分的权限区,每个权限区对应读、写、执行权限。
tips:权限只被认证一次。
示例:若你是拥有者,也是所属组,那么系统只认定你为拥有者。(从左到右检查)
开始前,思考一个问题:文件或目录的创建,它的初始化权限是什么样?为何是这样?
Linux默认规则:
(1)、创建一个目录,它的起始权限是:777。
(2)、创建一个文件,它的起始权限是:666。
附:777与666分别是为:拥有者、所属组、other的权限,将每一个八进制转化成二进制位就代表:111与101,再将其看作是布尔值。
虽然规则如此,但创建处的目录与文件的权限却出现了偏差:
(1)、以上的目录权限起始值若为:'777',那么应该是“rwxrwxrwx”才是。但实际却为:'775',对应:“rwxrwxr-x”。
(2)、以上的文件权限起始值若为:'666',那么应该是“rw-rw-rw-”才是。但实际却为:'664',对应:“rw-rw-r--”。
这是为什么呢?
之所以出现这样的情况,其实与umask掩码有关。
输入指令:umask,你会发现出现一串:0002的掩码,主要看后三位。
Linux系统的初始权限产生 = 权限码 & (~umask掩码)。
规则是这样的:凡是在umask中出现的权限,都不应该在最终权限中出现。
tips:即进制位相同为false。
小结:现在可以确定的是,每一次所创建的权限有其自身的默认值,而想要形成最终的权限则需要接受umask的过滤。
创建一个普通文件,使用权限码对文件权限进行修改。
将文件权限改为:拥有者(可读、不可写、可执行)、所属组(可读、不可写、不可执行)、other(可读、可写、不可执行)。
输入指令:chmod 546 bat.c
修改结果正确。
对粘滞位的使用存在指定的场景:
如果你需要创建一个目录,要其他成员用户在这个目录下进行工作,所以你必须打开所用用户的目录权限,但此时出现了一个问题:大家可能会误删掉别人的文件,那么这时候就需要用到粘滞位,而不是关闭其他人的写权限。
解决办法:设定粘滞位
输入指令: chmod +t bat.c
设置成功
附:
1、粘滞位只能给目录设置。
2、普通用户设立粘滞位必须本用户才能取消,root用户可更改一切。
3、粘滞位默认设置在other。
文章到此就结束啦!如果觉得还不错就关注Duoni叭!