这里写目录标题
权限及其操作
01.命令行解释器(Command interpreter)
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。
而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
将使用者的命令翻译给核心(kernel)处理。
同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的
操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
1.
理解:shell外壳程序
2.
表现:我们所看到的命令行提示符,以及可以输入的指令,并且可以执行
3.
感性认识:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的
且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提
亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫
它王婆,它对应我们常使用的bash。
这个故事里,程序员就是用户,小花就是操作系统,媒婆婆就是shell(命令行解释器),因为用户不善于和操作系统打交道,所以我们每次的命令行都会交给shell然后由shell交给操作系统。
4.
shell存在的意义:如果用户使用非法指令,shell不会将他交给操作系统,会拒绝。
变相保护操作系统。
协助用户沟通操作系统。
当程序员强行让王婆去给他说媒,但是这件事情是不会成功的,但是要强制王婆说媒,王婆会派实习生去进行说媒,一来可以保护自己的口碑,二来给程序员也有个交代,至于结果怎么样不重要。
派发实习生这种行为:执行命令,通过派生子进程的方式执行用户的指令,而shell本身并不执行对应的命令
(一般而言!)
Windows的图形界面,本质也是一种外壳程序
Linux shell命令行外壳和 win 图形界面,兄弟关系
bash 是在centos 7下的具体外核名字
02.基本的用户认识
用户被分为两类:
root 用户 超级管理员(不受权限的约束)礼不下庶人,刑不上大夫
普通用户 受权限约束的用户
root的密码 和 普通用户密码不要设置成一样的。
普通用户切换成root用户
su指令
作用:让普通用户变成root用户,且所在的路径不变,还是在普通用户切换前的路径
exit即可推出
su -指令
作用:让普通用户切换成root用户,所在路径要变成root路径,就是会重新登陆root用户
ctrl + d即可推出
演示如下:
root用户切换成普通用户
su + 用户名 不需要输入密码即可切换
我是普通人 ,我想用root身份执行一条命令,但是不想变成root,怎么办?
sudo:不切换用户,就想以root用户执行一条指令
sudo command:短暂的提权 -----让我自己输入自己的密码是为什么?
因为给受信任的用户,提供最少的执行障碍。
出现这种情况,是因为系统不相信我这个用户,需要将当前用户添加到/etc/sudoers中(相当于一个白名单)
03.权限的概念
1.含义
**1.**权限是用来约束缚角色(身份)的(一个或者某些群体)例子:qq音乐vip约束没有vip的角色
**2.**目标对象(电影网站,音乐app等),本来就没有对应的属性。(业务) 例子:用电影网站做oj题)
权限:一件事情是否允许被谁(约束角色(身份))做(目标对象)。
2.文件权限 = 人 + 文件属性
人
人:应该是角色,被分为拥有者,所属组,其他人
-rw-rw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt//第一个zjn是拥有者的位置 第二个zjn是所属组的位置,因为现在所属组只有我一个人,所以只会显示我。
问题:所属组
为什么会存在所属组的概念?
一个小故事理解所属组:张三和李四分别所在的团队在同一台Linux机器下开发一个软件,同台竞争,张三的领导想要看张三的代码,帮忙修正一下,张三现在是属于这份代码的拥有者(owner)的身份,如果没有所属组的概念,除了owner,就是other,如果把other这份权限打开,而另一个团队的李四,也能看见张三的代码,显然是不行的,所以有了所属组概念,将张三的领导拉入所属组,然后放开对所属组的权限就可以,这就是所属组存在的意义。
文件属性:
分为三种 r(读) w(写) x(执行)
上面显示的所有都属于文件的属性。
文件类型:
Linux 和 Windows(文件的后缀)差别很大
Linux系统认识文件与文件后缀无关 但是gcc软件还是要认文件后缀
1.
是不是意味着我们不可以使用文件后缀区分文件类型呢?
如果要使用,仅仅是给用户起到一个提示作用,后缀本质其实就是文件名的一部分。
2.
如何查看文件Linxu下的文件类型???
通过ll显示的众多属性中的第一列第一个字母符区分文件类型!!
Linux文件类型:
-
-: 普通文件 (源代码,库文件,可执行程序,文档压缩包等等)
-
d :目录文件
-
c :字符设备文件 (诸如键盘,显示器等文件)
-
b :块设备 (磁盘)
-
I : 链接文件 (快捷方式)
-
p :管道文件
文件权限属性
描述一个文件的权限,要描述到角色+所拥有的权限属性。
04.操作权限
1.设为文件所属角色。
2.设置文件属性。
chmod
**功能:**设置文件的访问权限
**格式:**chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
chmod命令权限值的格式
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
②三位8进制数字
1.
操作权限
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod u-r file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
--w-rw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod u+x file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
--wxrw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod u-rwx file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
----rw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod u+rw file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rw-r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod g-rw file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw----r-- 1 zjn zjn 0 Oct 6 15:46 file.txt
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rwxr-- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod o-r file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rwx--- 1 zjn zjn 0 Oct 6 15:46 file.txt
//同时操作两个角色的权限设置,中间加逗号。
[zjn@VM-8-17-centos ~]$ chmod u-rwx,g-rwx file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
---------- 1 zjn zjn 0 Oct 6 15:46 file.txt
//a代表all所有人,可同时操作拥有者,所属组,其他人
[zjn@VM-8-17-centos ~]$ chmod a-rwx file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
---------- 1 zjn zjn 0 Oct 6 15:46 file.txt
[zjn@VM-8-17-centos ~]$ chmod a+rw file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rw-rw- 1 zjn zjn 0 Oct 6 15:46 file.txt
用八进制方法,原理如下图。
[zjn@VM-8-17-centos ~]$ chmod 000 file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
---------- 1 zjn zjn 0 Oct 6 15:46 file.txt
-rw-rw-r-- 1 zjn zjn 0 Oct 7 00:04 test.txt
[zjn@VM-8-17-centos ~]$ chmod 777 file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rwxrwxrwx 1 zjn zjn 0 Oct 6 15:46 file.txt
-rw-rw-r-- 1 zjn zjn 0 Oct 7 00:04 test.txt
[zjn@VM-8-17-centos ~]$ chmod 660 file.txt
[zjn@VM-8-17-centos ~]$ ll
total 4
drwxrwxr-x 2 zjn zjn 4096 Oct 6 16:09 dir
-rw-rw---- 1 zjn zjn 0 Oct 6 15:46 file.txt
-rw-rw-r-- 1 zjn zjn 0 Oct 7 00:04 test.txt
2.
操作用户
我们把东西给别人是需要得到别人的同意的,但是两个人又不可能在Linux机器上同意,只能线下征求意见,那在Linux怎么操作呢,只有用sudo 提权,用root的身份给。
sudo chown zjn2 file.txt//改变拥有者
sudo chgrp zjn3 file.txt//改变所属组
sudo chown zjn2:zjn2 file.txt//同时改变这个文件的拥有者和所属组
我们不需要改变其他人的权限,因为拥有者和所属组是两个具体的人,而其他人是不具体的,且拥有者和所属组的改变,其他人也就对应的改变了。
3.
一个问题
若拥有者没有对应的权限,而所属组还有权限,为什么我们仍然不能对所属组所拥的有的权限去进行操作?
因为Linxu系统是先匹配角色,匹配角色的机制是类似于if eles if结构,匹配到我们是拥有者之后,只会使用拥有者的权限,而不是if if 的结构,拥有者的权限没了而去匹配所属组的权限。
注意:root不管属于什么身份,可以对权限进行操作,不受权限约束。
4.
权限存在原因
便于我们系统进行安全管理的。
05.权限掩码
引入:为什么我们创建的目录或者普通文件,默认权限是我们所看到的样子。
1.
Linux目录起始权限是从777开始的
2.
Linux文件起始权限是从666开始的
3.
**umask:**系统会默认配置好权限掩码,凡是在umask出现的权限,都必须在起始权限中去掉!!
umask能被修改!!!
这个去掉是做减法吗?不是的,通过把umask修改成0111可以证明。
最终权限=起始权限 & (umask)【是对权限掩码按位取反】
[zjn@VM-8-17-centos ~]$ umask
0002
修改权限掩码后:
最终权限例子:
[zjn@VM-8-17-centos ~]$ umask 0032
[zjn@VM-8-17-centos ~]$ touch file.txt
[zjn@VM-8-17-centos ~]$ ll
total 0
-rw-r--r-- 1 zjn zjn 0 Oct 7 01:11 file.txt //可以看出权限编码是644
umask默认去掉的权限是1,保留位是0
~umask默认去掉的权限是0,按位与就能保证,能够去掉权限。
如果我们要进入一个目录,需要什么权限?
必须需要x权限
为什么系统需要规定一个目录必须是从777开始的?
所有的目录被创建出来,一般都要进入x。
为什么系统需要规定一个文件必须是从666开始的?
jn zjn 4096 Oct 6 16:09 dir
-rw-rw---- 1 zjn zjn 0 Oct 6 15:46 file.txt
-rw-rw-r-- 1 zjn zjn 0 Oct 7 00:04 test.txt
[外链图片转存中...(img-2gaMtFCJ-1665110356751)]
### `2.`操作用户
我们把东西给别人是需要得到别人的同意的,但是两个人又不可能在Linux机器上同意,只能线下征求意见,那在Linux怎么操作呢,只有用sudo 提权,用root的身份给。
sudo chown zjn2 file.txt//改变拥有者
sudo chgrp zjn3 file.txt//改变所属组
sudo chown zjn2:zjn2 file.txt//同时改变这个文件的拥有者和所属组
我们不需要改变其他人的权限,因为拥有者和所属组是两个具体的人,而其他人是不具体的,且拥有者和所属组的改变,其他人也就对应的改变了。
### `3.`一个问题
若拥有者没有对应的权限,而所属组还有权限,为什么我们仍然不能对所属组所拥的有的权限去进行操作?
因为Linxu系统是先匹配角色,匹配角色的机制是类似于if eles if结构,匹配到我们是拥有者之后,只会使用拥有者的权限,而不是if if 的结构,拥有者的权限没了而去匹配所属组的权限。
注意:root**不管**属于什么**身份**,可以对权限进行操作,不受权限约束。
### `4.`权限存在原因
便于我们系统进行安全管理的。
****
## 05.权限掩码
引入:为什么我们创建的目录或者普通文件,默认权限是我们所看到的样子。
`1.`Linux目录起始权限是从777开始的
`2.`Linux文件起始权限是从666开始的
`3.`**umask:**系统会默认配置好权限掩码,凡是在umask出现的权限,都必须在起始权限中去掉!!
umask能被修改!!!
这个去掉是做减法吗?不是的,通过把umask修改成0111可以证明。
***最终权限=起始权限 & (~umask)【~是对权限掩码按位取反】***
[zjn@VM-8-17-centos ~]$ umask
0002
[外链图片转存中...(img-dErW8Jzh-1665110356751)]
修改权限掩码后:
[外链图片转存中...(img-bw1ckq5B-1665110356752)]
最终权限例子:
[zjn@VM-8-17-centos ~]$ umask 0032
[zjn@VM-8-17-centos ~]$ touch file.txt
[zjn@VM-8-17-centos ~]$ ll
total 0
-rw-r–r-- 1 zjn zjn 0 Oct 7 01:11 file.txt //可以看出权限编码是644
[外链图片转存中...(img-yWOnj76K-1665110356752)]
**umask默认去掉的权限是1,保留位是0**
**~umask默认去掉的权限是0,按位与就能保证,能够去掉权限。**
如果我们要进入一个目录,需要什么权限?
必须需要x权限
为什么系统需要规定一个目录必须是从777开始的?
所有的目录被创建出来,一般都要进入x。
为什么系统需要规定一个文件必须是从666开始的?
大多数一般的文件都不需要可执行,如果要可执行后面加上即可。