碎碎念:
本篇我们主要学习Linux权限的知识,你将会了解什么是用户,如何切换用户?什么是权限,有哪些基本权限,又如何切换权限?……。
在权限开始之前,我们先顺带介绍一下shell外壳程序。
目录
I. shell外壳程序
II. Linux权限的概念
用户
切换用户
切换用户路径
Ⅲ. Linux权限
权限
文件类型
用户身份
基本权限:读、写、执行、无权限
Ⅳ. 怎么改权限?
改文件的属性
chmod
没有权限会怎样
改人的权限
chown
chgrp
怎么强制改人的权限?
Ⅴ. 目录权限
进入一个目录需要什么权限?
目录的r、w、x权限
权限的悖论?
Ⅵ. umask
权限的初始值
umask
Ⅶ. 粘滞位
引入
粘滞位
我们是直接操作操作系统的吗?其实不然。
如果直接使用操作系统,那用起来,得牵扯到很多底层的细节,
专业性太强,并不适合广大用户。
我们访问操作系统,是直接与shell外壳程序进行交互的,shell再去和操作系统打交道。
shell外壳程序,在Win下是图形化界面,在Linux下就是指令。
说一个帮助理解的小故事:你喜欢小花,但害羞不敢跟她讲话,所以你去找了媒婆。
这位媒婆姓王,我们叫她“王婆”。
王婆帮你说媒,把你的想法转达给她。
这样,你不用和小花直接打交道,而是通过王婆 间接实现了和小花的交流。
这里的”你“就是用户。
”小花“就是操作系统。
“媒婆”就是shell外壳程序。
shell:命令行解释器
将使用者的命令翻译给操作系统处理。
同时,将处理结果翻译给使用者。
shell是用户和操作系统交互的中间软件层,
方便用户的同时 也在一定程度上保护了操作系统。
然而,我们采用的命令行解释器不叫shell,叫bash。
shell和bash的关系,就对应媒婆和王婆的关系。
shell 是外壳程序的统称,而bash是其中的一种。
Linux下有两种用户:
1.超级用户root:可以在Linux系统下做任何事情,不受限制。
(root简直是上帝身份)
2.普通用户:在Linux下只能做有限的事情。
超级用户的命令提示符为”#“,普通用户为”$“。
那么怎样进行用户间的切换呢?
用命令su
root----->普通用户user: su user(这里的user是具体的用户名,如 jzy)
user----->root : su root(root可省略)
基于root用户的上帝身份,在root用户下,你想进哪个user都行,不用输密码✌。
而普通user之间进行su切换,是要输入用户密码的。
进root用户,要输root的密码。
这里强烈建议:root的密码和普通user的密码别设成一样的!
否则你在输密码时很容易脑袋晕晕,不知道自己在进哪个用户。
演示:
不过,su [用户名] 的方式只能切换用户,
你的用户路径还是原来那个,并没有同步切换过来。
比如:我现在从root 切换到 普通用户jzy,想要建目录or文件,然而:
发现都建不了!为什么呢?
原来,是因为我们su的命令只切换了用户,而路径还停留在原来的root下:
敲黑板!
su [用户名] 只会切换用户,而不会切换用户路径;
su - [用户名] 会在切换用户的同时,把用户路径也给切换掉。
现在,我们把su指令写成su - jzy,然后看看路径还是不是root了:
看最后一行,已成功切换到用户家目录下了。
补充:
如果我们用su从root切到普通用户身份,而路径没切,
那也可以用 cd ~ 的方式进入用户的家目录。
先来搞清楚一个问题:什么是权限?
在Linux中,权限是用来控制文件和目录访问的机制。
通俗而言,权限==人+事物属性
权限是针对人的;权限是由事物的属性决定的。
举个例子:b站里的视频,up主拥有删评的权限,而评论者就没有这条权限;
我们不能在教室游泳,因为教室的属性就决定了它压根没法游泳。
我们可以使用 ls -l 来查看文件的权限。
我们先来看第一列。从第一列的第一个字符开始认起。
要知道,在Linux下,是不以文件后缀来区分文件类型的。
但并不代表不可以使用,我们仍然可以加后缀。
给文件命名为test.c,虽然这对编译器而言,和test、test.txt没区别,
但是利于我们程序员辨别文件类型。
想知道文件类型,就用ll命令。ll显示出的第一个字符,表明该文件的类型。
文件类型包括:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
我们现在就只需掌握d和-,其余的以后会讲到。
补充:注意区分Linux和Linux下的软件!
gcc test.txt是编不过去的,因为gcc是Linux下的一款软件,
它不等于Linux系统,区分文件类型的机制也不一样。
我们来学习第二列和第三列,它们表示用户身份,
分别是:文件的所有者和所属组。
用户身份(人)分为三类:所有者(User)、所属组(Group)和其他用户(Others)。
所有者(u):文件属于谁
所属组(g):文件属于哪一组的
其他用户(o):只要不属于上面两种的,就是other
为什么要有所属组的概念呢?
讲个小故事:
一家公司里只有一台云服务器,而A、B两组要同时做同一个项目,
两组是竞争性质的,彼此的数据要保密,不能透露给对方。
这时,领导想看看A组小明的成果,要怎么办呢?
假如没有组的概念:小明是所有者,其它人都是other。小明要是放开权限给领导访问的话,
那B组的人肯定也能访问了。小明要是关闭权限,那领导和组员都看不了。
如果有了组的概念:想要谁看,就把谁拉近组里。组员能看,other看不了。
所以说,有了组的概念,我们能更灵活地配置权限。
你可能有点晕:刚刚不是学了root和user么,和这里的用户身份有啥区别?
这就好像,老师和学生是两种身份,而这两种身份由具体的人扮演。
这里的用户身份可认为是一种角色or身份,指特定的人对应的身份。
而root和user值具体的人,两者并不冲突。
user可以是所有者,也可以是所属组。
刚刚我们学习了:第一列的第1个字符是表示文件类型的,现在我们来学习后面9个。
每3个分成一组来看,每组对应着 不同的用户身份 具有的权限:
第一组是owner的基本权限,后面两组分别是group、other的。
什么是文件的基本权限呢?
4个基本权限:读(r)、写(w)、执行(x、execute)、无权限(-)。
1.读 :Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
2.写 :Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
3.执行 :execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
4.“—” 表示不具有该项权限
示例❄️:我们来读一下 上图最后一行的权限:
所有者可读可写;所属组只读;其他用户只读。
改权限包括两个方面:1.改变文件的所有者(人) 2.改文件的属性
change the permissions mode of a file
功能:设置文件的访问权限。
格式:chmod (参数)权限 文件名
常用选项: -R 递归修改目录文件的权限
注:只有文件的拥有者和root身份才能改权限。
chmod命令权限值的两种格式:
1.用户表示符 + / - / = 权限字符
用户表示符包括:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
+: 向权限范围增加权限代号所表示的权限
-: 向权限范围取消权限代号所表示的权限
=: 向权限范围赋予权限代号所表示的权限
例:
2.三位八进制数字
因为rwx的每位都是两种情况:可or不可。所以每位都可视为一个二进制位。
每个权限是3三个二进制位,即可视为1个八进制位。
eg:rwx为111,r-x为101
实例:chmod 664 /home/abc.txt
如果是root身份,那无所谓,root压根不受权限约束,
权限约束的是普通用户。
普通用户身份如果没有权限 -----> 报错,无法访问:Permission denied
change own
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
如:
chown user1 f1
chown -R user1 filegroup1
change group
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
如:
chgrp users /abc/f2
如果要给别人一样东西,我们是不能随心所欲、想给就给的,要征得对方的同意才行。
改人的权限也是一样。
如果我们只是普通用户,那是改不了权限的:
只有当我们升级成上帝身份root,才能随心所欲地更改,无需对方同意。
那出了转成root身份强制改,有没有什么温柔一点的方法呢?
有的,用sudo命令提升权限。
例:
(我们此时是普通用户whb)在chown命令前加上sodo就可以改了:
其实sudo本质还是强制改的:sudo的后续命令,将以root的身份执行。
也就是说,chown whb myfile.txt这条命令是以root执行,
但只是这一次执行,后面其他的命令还是以whb身份执行。
那离谱了:这么说,我们想强改权限的话,全都加个sudo不就好了?
其实不会,普通用户是没法执行sudo的,必须是root把你添加到信任列表里,你才能sudo。
这个问题是常见的权限面试题。
我们来一一验证下r、w、x。
有r:
这说明cd一个目录与r无关。
有w:
这说明cd一个目录与w无关。
有x:
成功进入!
所以,进入一个目录,必须得有x权限。
查看目录下的文件列表 需要:r权限
要在目录下创建文件or目录 需要:w权限
进入目录 需要:x权限
敲黑板!
目录的可执行权限是表示你可否在目录下执行命令。
如果目录没有 -x 权限,则无法对目录执行任何命令,
甚至无法cd 进入目, 即使目录仍然有-r 读权限。
所以说,有 r 也不一定能进入目录读取文件
这个地方很容易错
而如果目录有x 无 r,那用户可以执行命令,可以cd进入目录。
但由于没有r权限,所以即使可以执行ls命令,但仍然无法读取文档。
现在出现一种尴尬的情况:
作为所有者,你啥权限都没;作为所有组,你所有权限都有。
那到底听谁的呢?
示例:
权限只被认证一次,只要你是所有者,那只看所有者的权限;
如果你不是所有者 但 是所属组,就只看所属组的权限。
Linux下,创建出一个文件或目录时,是有默认权限的。
目录的默认权限为777;
文件的默认权限为666.
但我们实际创建出来的目录,看到的权限并非777,而是775;
文件也并非666,而是664:
可见,最终的权限并不等于默认权限!这是为什么呢?
实际上,创建文件和目录时,还要受到umask的影响。
umask命令,用于设置新创建文件和目录的访问权限掩码,
简单来说,我们最终的文件权限,是默认权限和umask共同作用的结果。
假设默认权限是m,则实际创建的出来的文件权限是: m & (~umask)。
即先将umask按位取反,再和m按位与。
权限掩码是可以查看和改变的,umask指令的功能,就是查看或修改文件掩码 。
$ umask //查看
$ umask 044 //修改为044
root和普通用户的默认umask是不一样的:
超级用户默认掩码值为0022,普通用户默认为0002。
Linux下,会存在共享目录,以便多个用户共享文件和资源,从而达到用户之间的协作。
比如,我们QQ群和钉钉群常用的协作文档。
大家在同一个目录下,进行读写、新建、删除等操作。
这样的目录,一般所有者和所属组都是root,其他人以other的身份操作。
那似乎有一个隐患:假如我写的文件被别人误删了怎么办?
毕竟,在目录当中,删除和新建一样,是不需要经过同意的,
也没有设限,这不同于r、w、x权限。
新建或删除文件,和文件本身的权限没有关系,而是跟 所处的目录 是否给了读写权限 有关。
所以默认情况下,共享目录的成员可以互删彼此的文件。
我们希望达到的是:在共享目录下,只能自己删自己的,而不是删掉别人的。
对此的解决方法是:将目录设置为”粘滞位“。
chmod + t [目录]
说明:
1.粘滞位只能给目录设置,不能给文件设置。
2.我设置的粘滞位会被别人取消设置吗?
不会。一般是谁设置,谁取消。
3.粘滞位只能给other设置。
4.设置粘滞位以后,只能被这三种身份删除:
a. 超级管理员删除 b. 该目录的所有者删除 c. 该文件的所有者删除
这里的情况是基于共享目录,大家需要有读写的权限。 这时得用粘滞位。
如果不需要别人写入,那你不想自己的文件被别人删掉的话,只需把w权限去掉就可以。
好啦,本篇的知识点就讲到这里。现在,我们已经过了新手村,系统掌握了Linux的基本指令。
下节我们将学习如何在Linux下编程。