一、shell命令以及运行原理
首先,我们先来看看这个问题:我们使用命令是直接操作Linux吗?答案就是当然不是直接访问操作系统。这是为什么呢?
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
为什么我们人一般不能直接使用kernel?(直接访问linux)
操作系统过于复杂,操作成本高,一般的人不擅长直接使用,毫不夸张地说,这个世界上很少有人能够直接使用。
所有就有了各种“外壳”程序。举个例子:司机不一定懂得汽车的构造和运行原理,所有汽车的设计者就将这些东西用一个外壳包装起来,用普通人容易掌握的方向盘和挡位来和汽车的发动机等设备进行“交互”,这样普通人也可以驾驶结构和运行原理复杂的汽车了。
而Linux的外壳程序就相当于汽车中的方向盘和挡位的作用。人们可以通过外壳程序使用一些简单易懂的指令来间接操作Linux。人们将指令输给外壳,外壳将指令翻译传输给操作系统,然后将操作系统的反馈翻译传输给人。这样操作成本就大大地降低了。
再比如windows系统,我们也不是直接使用操作系统,而是微软将操作系统用图形化的界面进行了包装,使得普通人能够间接访问操作系统。而这个图形化界面程序也是一种shell外壳。
我们可以看一看我们使用的外壳程序是什么:
bash和windows的图形化界面都属于sell外壳。
二、Linux权限的概念
1、对人操作
Linux下有两种用户:超级用户(root)、普通用户。(Linux下可以存在多个用户)
root用户:只有一个,具有Linux下的最高权限,一般不受权限约束。
普通用户:可以有多个,要受权限约束。
当我们在用户之间进行身份切换时,就相当于我们在切换当前的权限。那么用户的身份怎么切换呢?使用 su - 命令就可以由普通用户切换为root用户(要输入root用户的密码)。在root下,su 用户名 命令可以直接切换用户身份,不需要输入密码。普通用户切换成另一个普通用户要输入密码。
2、对角色和文件操作
简单来说,就是什么样的人(不同的访问者)对同一个文件是否具有读、写、执行的权限。
文件类型和访问权限:
在ll命令下,红色方框里面的内容就是和权限相关的了。
第一列中的 - 和 d:表明该文件的文件类型。d目录,- 普通文件,p 管道文件,b 块设备,c 字符设备。Linux下,不以文件后缀来区分文件的类型(但是用户可以给文件添加后缀来自己区分)。
后面9个字符和下面的文件访问者就有关系了:
u—User:拥有者,即文件属于谁。
g—Group:文件和文件目录的所有者所在的组的用户,即文件属于哪个组。
o—Others:其它用户。不属于上面两个的任何一种,就是others。
每三个字符,就分别代表u,g,o对该文件的读、写、执行的权限。比如:第一个文件,前三个字符 rw- 是u对该文件的权限,接着三个字符 r-- 是g对第一个文件的权限,最后三个字符 r-- 是o对该文件的权限(是r,w,x表示有权限,-表示无权限)。
如:u对该文件有读、写的权限,没有执行的权限。g对该文件只有读的权限,没有写和执行的权限。(第一个root是 u,第二个root是 g)。
注:r,w,x 三个权限的位置固定,顺序固定。
3、权限的操作
还是上面的文件,我们执行下面的操作:
通过上面的操作,我们可以自己修改文件的权限。
三、权限的八进制表示
上面所讲的修改权限的方法是通过 ugo+-的方式进行文件权限修改。而在Linux中还有一种文件权限的修改方法。
我们知道,一个权限,一共有9列字母,3个为一组,每一组的相对位置是确定的。r一定在第一个,w一定在第二个,x一定在第三个。而每一个位置要么有,要么没有。那它就是一个两态的。那么我们就可以用1表示有,0则表示没有。比如:rwx就可以表示成111(八进制为7),rw-(八进制为6)就可以表示成110。
因此,我们可以像下面这样修改权限:
上面这种方法也叫做(八进制修改权限的方法)。
四、修改文件的拥有者和所属组
1、修改文件的拥有者
chown 功能:修改文件的拥有者 语法: chown 用户名 文件名
2、修改文件的所属组
chgrp 功能:修改文件或目录的所属组 语法: chgrp 用户组名 文件名
3、sudo
在一个命令前加上sudo,在执行该命令时,要以root权限级别来执行。(如果用户想要使用它来提升权限,那么它必须要被root用户添加到信任列表里)。
注:更改文件的拥有者和所属组需要提升权限。
五、权限常见的问题
1、目录的权限
如果我们要进入一个目录,需要什么权限呢?这个答案就是 x 权限。
演示:
从上图中我们可以看到,如果去掉了 x 权限,我们就不能进入目录了。
可执行权限: 如果目录没有可执行权限, 则无法进入到目录中。
可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容。
可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
2、umask
Linux默认:
一个目录被创建,起始权限是:777。
一个普通文件被创建,起始权限是:666。
但是看下图,为什么显示出来的文件权限不是上面默认的那样呢?
下图中,dir的权限是775,zdl.txt的权限是664。
我们发现文件或目录的起始权限和最终权限并不一样。其实这就和linux中的umask有关了。
umask:叫做权限掩码。规定:凡是在umask中出现的权限,都不应该在最终权限中出现。(一般来说,umask默认为002)。
最终权限的算法:最终权限 = 起始权限 & (~umask)。
举个例子:~umask二进制为 111 111 101。目录的起始权限为777,其二进制为 111 111 111。两者按位与为 111 111 101。转换成八进制775。
注:umask是可以人为改变的。
3、粘滞位
假如有如下场景:当有多个用户在同一路径下,并共享同一个目录,共同维护多个文件。
问题:一个用户能够删除属于另一个用户的文件吗?
可以。因为从上面目录的权限中我们知道:如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
所以,在目录中创建和删除里面文件的权限不是文件本身的权限,而是目录的权限。
既然有多个用户在同一个目录下能够创建文件,那就说明这些用户对该目录有写的权限,而有了对该目录的写的权限后,我们自然而然就有了对该目录下的所以文件进行删除的权限。那么一个用户能够删除属于另一个用户的文件。
但是,这合理吗?这当然不合理。我辛辛苦苦写好的文件,别人只要动一动键盘,就可以在不经过我的同意下删除它,这当然是不被允许的。所以,为了解决这个问题,就有了粘滞位。
在一个公共目录中,大家各自可以进行rwx操作,但是禁止大家互删对方的文件,因此我们需要给这个公共目录设置粘滞位(权限的一种特殊情况)。
用法:在根用户下,chmod +t 目录
去掉粘滞位:chmod -t 目录
注:1、粘滞位只能给目录设置。2、一般是谁设置,谁才能取消(root除外)。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
1、超级管理员删除
2、该目录的所有者删除
3、该文件的所有者删除