写在前面
本章我们将重点讲解 Linux 权限,这是 Linux 基础部分中非常重要的一部分。内容比较干,我会稍稍正经些去讲解。话不多说,我们直接切入正题。
严格意义上说的是一个操作系统,我们称之为 —— (核心), 但我们一般用户,是不能直接使用 的,而是通过 的 "外壳" 程序,也就是所谓的 ,来与 进行 "沟通 " 。
中, 就是命令行解释器(command Interpreter),其主要包含:
① 将使用者的命令翻译给 处理。 ② 同时将 的处理结果翻译给使用者
中, 就是 (图形化界面),我们操作 也不是直接操作 内核的,而是通过图形接口,点击从而完成我们的操作,所以其实也是一个外壳程序。
对于 ,有相同的作用,主要是对我们的指令进行解析,解析指令给 内核。反馈结果在通过内核运行出结果,通过 解析给用户。
1.命令行解释
(充当媒婆)
内核的设计非常复杂,使用者无法直接向Linux内核进行沟通,也无法直接读懂内核执行完命令的结果所以shell外壳充当"媒婆"这一角色来往于操作者和内核之间,
2.保护内核
(充当保安)
有时用户想要内核执行的命令过于离谱,或者使用的指令内核根本做不到,那么此指令根本不会"打扰"内核,它会在shell外壳进行翻译时就被驳回!
Linux下的shell外壳是bash,而windows下的shell外壳是图形化界面
Linux 的用户分为 root 和普通用户,root 为超级用户,就像 Windows 系统中的管理员。
确认当前你是哪个用户,可以输入 whoami 指令:
whoami
我们当前是普通用户,如果想切换至 root 用户,我们可以输入 su -
su -
root 和 Linux 下任何一个用户,都要设置密码。
建议不要把 root 密码和普通用户的密码设置成一样的! 这不仅是出于安全角度,设置成一样的话现阶段容易搞混,你不知道什么时候要输的是什么密码。这里我们要切到 root,所以输入的是 root 的密码:
实操:当我们 su - 并输入正确的密码后,就可以完成用户的切换操作:
$ su -
Password:
在 root 用户下,想要切到普通用户甚至连密码都不需要输:
# su [用户名]
当然,如果你是普通用户想切换到另一个普通用户,当然还是需要输入密码的。
$ su [用户名]
Password:
当我们输入 ls -l 显示详细信息时,你有没有注意过这些信息?
像这样的:
-rw-rw-r--
drwxrwxr-x
通过 ls -l 显示出来的是 文件的属性,而用过 cat 看到里面的是 文件的内容。
我们既然要学习权限,我们重点要理解 ls -l 显示的若干的字母组合。
-rw-rw-r--
drwxrwxr-x
第一列的第一个字符,叫做 "文件类型" 。
Linux 中不是以文件名后缀区分文件类型的,而是通过 ls -l 显示的第一个字符区分文件类型的。
这有点颠覆我们的直觉,因为我们 Windows 是文件末尾 [ .类型 ] 的格式去区分文件类型:
而在 Linux 下你跟我说文件类型跟后缀没有关系?!我们验证一下看看:
在我们 Windows 下,这里的 a.txt 这就是一个文本,但是在 Linux 是完全不关心你后缀是什么的。
Linux 的文件后缀纯属摆设,我们写后缀只是是为了给自己看的。
概念:Linux 是根据第一列第一个字符去区分文件的类型的。
注意事项:
既然 Linux 文件后缀纯属摆设,那我们把 test.c 改成 test.txt,然后用 gcc 编译可以吗?
虽然 Linux不以文件名后缀区分类型,但是 Linux 并不排斥以后缀做文件类型。
思考:什么是权限?
① 约束人的(对人进行分类)
② 需要对应的事物具有特定的属性
Linux 上,对文件的权限:
这个文件谁能访问?这个文件谁不能访问?
对应的文件应该具备的某种属性:r,w,执行 x
在 Linux 系统中,人分三类:
① 文件的拥有者 owner ② 文件的所属组 grouper ③ 文件的其他用户 other
Linux 系统中文件的权限属性分为 r(读)、w(写)、x(可执行)。
每一组,对应的权限的为止含义是确定的。
那么文件的权限操作,应该涉及到几方面呢? ① 修改文件的属性 ② 修改人
字符表示方法:
只需要搞明白 r w x - 这四个字符分别代表说明意思,就能轻松理解。
八进制数值表示方法:推荐使用
思考:如何区分一个文件?
显然这一串信息是无法满足我们了,我们还有一个专门用来辨识文件类型的指令 —— file 指令。
file [选项] 文件或目录
功能:辨识文件类型
常用选项:
操作演示:file
chmod [参数] 权限 文件名
功能:设置文件的访问权限
常用选项:
chmod 命令权限值的格式:
① 用户表示符+/-=权限字符
用户符号:
权限可以加上,亦可以除去!!!
像上面的test.txt没有可执行权限,我们加上:u+x之后,被绿了(bushi),变成了可执行 的了。
如果我想去掉某身份的读权限,我们可以:
chmod [分类]-[权限] {文件名] # 去除权限
chmod [分类]+[权限] {文件名] # 添加权限
当然,还允许复合使用:
当你什么权限都没有时,会受到种种限制:
然而这些限制对至高无上的 root 来说,并没有什么卵用:
讲完权限的修改了,我们再回到 Ⅱ.0x04 继续探讨 "八进制数值表示方法"。
任何一个八进制数(0~7)都可以被写成三个比特位,这三个比特位壹壹和每一类人对应。
我们有三类人,则需要3个八进制数与之对应,所以就有了 777、000、333 等更改权限的方案。
譬如 \textrm{owner} 的 - - - 分别对应 r\, w \, x ,有或者无(两态),111 → 八进制 → 7。
\textrm{owner}→ 5 → 101 → r-x,原理是将八进制看作成二进制,对应上我们的权限。
八进制数值表示方法 :
chown [用户名] [文件名] # 修改文件的拥有者
如果我是一个文件的拥有者,我想把文件给别人:
思考:当你想给别人东西的时候,要不要经过别人的同意?
当然需要!这里我们可以用 sudo 指令强制给别人:
(sudo 有一个叫信任列表的东西,你现在输入如果出现报错是因为 root 没有把你添加到信任列表里,这个我们后期讲完 vim 之后再说。在 /etc/sudoers 路径下。)
不要????那就硬给。
当然我们还可以直接切换成 root,通过 root 去给,别人不要也不行,就是这么。
一个文件的创建者和拥有者一定是同一个人吗?
通过我们刚才修改文件的拥有者,我们就能得出 —— 不一定。
chgrp [用户名] [文件名] # 修改文件的所属组
和 chown 一样的用法,我们可以用 chgrp 指令改变文件的所属组 group。
对于dir是一个目录,我们来去掉 权限,看看到底能不能进入这个 dir:
我们发现没有r也能进入dir目录。这就说明进入一个目录跟 没有关系。
跟w也没啥关系。
如果我想进入一个目录,需要说明权限?
如果目录只没有 权限,允许进入、允许在该目录下创建(写入)文件,只不过是不允许查看:
如果目录只没有 权限,允许进入,允许在该目录下查看文件列表,但是不允许创建文件:
如果同时没有 权限,允许进入,但是不允许创建和查看目录下的文件列表。
Linux 下一切皆文件,目录也是文件。再结合 "文件 = 内容 + 属性" 去理解。
目录里面保存的是部分文件的 "属性" 。
为什么创建目录的默认权限是 775,而创建普通文件的默认权限是 664 ?
不同系统可能有差异吗?
创建的时候为什么不可以都是 777,权限都给我怼上呢?
默认权限:① 默认目录的起始权限:777 ② 默认普通文件的权限:666
既然如此,那为什么不是 777 / 666,而是 775 / 664 呢?
默认权限 != 最终权限,Linux 中的最终权限 = 默认权限 "去掉" umask 中存在的权限。
因为系统中有一个默认的 "权限掩码" ,叫做 umask:
umask # 打印权限掩码
权限掩码:凡是在权限掩码中出现的权限,都不应该在最终权限中出现!
所以,最后目录的默认权限变为了 775,文件权限变为了 664。
❓ 思考:所谓的 "去掉" umask 中的权限,是不是减去呢?
这里的 "去掉" 并不是减去。首先要说的是,umask 是可以修改的:
umask [掩码] # 修改umask掩码
由此可见,我们的权限确实是受 umask 的影响的。但是实际上是这样计算的:
最终权限 = 默认权限 & (~umask)
Linux 下可以存在一些目录,拥有者和所属组是 root,
其他人允许以 other 的身份在该目录下进行文件的创建、读取、删除和修改等操作:
注意事项:在一个共享目录下,你不让我写,不让我读,但防不住我删除!
比如,有两个普通用户,用户A想让用户B访问它的文件,于是就 chmod 把 other 的 全撤咯,
于是用户B急了,恼羞成怒,啊你不给我用你也别想用了,得不到就毁掉!直接给你把文件删了。
如果你仍然是想在共享目录下形成临时文件,但又怕别人给你删了,
你可以给共享的 <目录> 加上粘滞位来解决。
注意,是给目录加粘滞位!即你共享哪个目录,你就在哪个目录下加上粘滞位。
我们下面来隆重介绍一下 Sticky bit ——粘滞位。
chmod +t [目录名] # 添置粘滞位
以 root 身份给 all 目录添置粘滞位:
目录设置了粘滞位 后,作为 other 就无法随意地删除其他用户的文件了:
不过 root 还是想删就删,想干啥就干啥。
还是那句话 —— 普通用户再怎么进行文件操作,对 root 都是无效的。