一.预备知识
1.LInux用户分类
一台Linux机器的用户分为两类:
超级用户和普通用户。
注意我这里说的用户的并不是一个固定的人,例如你本身就有root账号,但你也可以使用自己创建普通账号。当你使用root账号时,你就是一个超级用户,当你使用普通账号时,你就是一个普通用户。更简单地说,这里的用户对应的是正在使用的账号。
root账号无所不能,不受权限约束,而普通账号则受权限约束。具体怎么一回事下面再说。
2.切换用户的指令
当你想切换到不同用户时,可以使用su指令,后面加上想要切换成哪个用户,如果不加,默认是root用户
从普通用户切换到超级用户:
su
接下来会提示你输入密码,这里输入的是root账号的密码。
从超级用户切换到普通用户:
su zhangsan
假设你添加了zhangsan这个用户,就可以使用本条指令切换用户,root用户可以任意切换身份,不需要输入密码
从普通用户切换到普通用户
su lisi
假设你现在登录的是张三的账号,你想要切换成李四,就可以使用上述的命令,前提是你要知道李四的密码
su -
你也可以使用这条指令切换账号,他和su的效果基本一样,只不过su只是单纯地账号切换,而su -是重新登录账号,最终的效果就是前者仍然在以前的目录,而后者会回到切换账号的家目录
二.权限的理解
怎么理解权限?权限就是能不能做某件事,它是一个是否的问题,所以权限必然包含两个要素,谁能不能做事?(who) 做什么事?(what)
Linux系统当中,“一切皆文件”,故我们操作一台机器,实际上就是访问机器当中的各种各样的文件。所以我们说,“权限是伴生文件的”,某个具体的文件(这里是广义的文件,包括目录等),权限就是约束用户对文件能做哪些事情。
三.文件访问者的分类
根据和某个文件的关系,所有用户可以被分为三类:
- 拥有者 u--User
- 所属组 g-Group
- 其它人 o-Others
拥有者默认就是创建这个文件的人
所属组是专门为这个文件划的一个群体,里面可以有一个或多个用户,并且有一个组长,最初默认只有文件的创建者一个人,并且担任组长、
这里可能会有一个疑问,不是说用户分为超级用户和普通用户吗?这里不是和上面冲突了吗?
超级用户和普通用户是某个具体的人,而拥有者,所属组和other是某种角色,二者是相互补充,互相成就的关系。
例如,张三是一名学生,想去教职工食堂吃饭但是被拦住了。于是张三奋发图强,大学毕业后当上了老师,可以正大光明地去教职工食堂了。张三能去教职工食堂吃饭,是因为他是张三吗?不是,是因为他是老师。张三从学生这个角色向老师转变,但他的姓名,身份证号没有改变,从他出生起,他就叫张三。所以我们说张三这个人的角色先是学生,后是老师。
四.文件类型和访问权限
我们可以使用ls -l 指令来查看当前目录下所有文件的属性,一个文件的属性如下
1.文件类型
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
文件类型很多,我们只需记住普通文件和文件夹的表示符号就可以了。
2.基本权限
你能对一个文件做什么呢?无非就是读,写,执行,所以基本权限也就是这三种
i.读:Read对文件而言,具有读取文件内容的权限;对目录来说,具有查看该目录下文件信息的权限
ii.写:Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
iii.执行:execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
iv.“—”表示不具有该项权限
针对helloworld这个文件,它的文件类型是- ,即普通文件,拥有者的权限是rw- ,(可读可写不可执行)所属组的权限是r-- (可读不可写不可执行), 其它人的权限是r--(可读不可写不可执行)。
顺便提一下,Window中一个文件能否被执行要看它的文件名后缀,例如exe就是可执行文件。而在Linux中一个文件能否被执行取决于你有没有x权限,与后缀名无关。
注意我的用词,Linux系统本身不按照文件后缀来区分文件类型,不代表上面的软件不认后缀哟。例如用gcc编译一个txt文件就不行。
现在正式提出问题:dir这个文件的权限是什么?
答:对于helloworld这个文件,拥有者具有rwx权限,所属组具有rwx权限,others具有rx权限,没有w权限
前文说过,要描述一个文件权限需要包含两个要素,who?拥有者,所属组和others。what?r、w、x
五.文件访问权限的相关设置方法
1.chmod
功能:设置文件的访问权限
chmod u+x test.txt
给test.txt文件的拥有者加上x权限
chmod u-x,o+w test.txt
给test.txt文件的拥有者取消x权限,others加上w权限
chmod a-w test.txt
给test.txt的拥有者,所属组和其他人都取消w权限
注意:只有文件的拥有者和root才能改文件的权限。
root虽然是others,但它是不受权限约束的。即使是文件的拥有者也是受到权限约束的,也就是说,当拥有者把自身的w权限取消时,也不能向文件中写入内容,但这样做是没有意义的,因为自己能把权限改回来。
还有一个问题,虽然我是拥有者,w权限被取消了,但我同时还是所属组的组长啊,假设所属组是有w权限的,那我能否向文件中写入内容呢?也不能。因为一个用户在匹配角色的时候,只会匹配一次,先判断你是不是拥有者,如果是就不再匹配了。
2.chown
功能:改变文件的拥有者
chown zhangsan test.txt
将test.txt的拥有者改为zhangsan
注意:只有root才能更改文件的拥有者
3.chgrp
功能:改变所属组的组长
chgrp zhangsan test.txt
注意:只有root才能更改文件的所属组组长
六.文件权限的八进制表示方案
前面我们知道,要表示一个文件的权限,需要9个位,每三个为一组,分别表示拥有者,所属组和others的权限,每一位只有两种情况,要么是-,要么是对应的字母(r,w,x)。故我们也可以采用9个二进制位来表示权限,0表示没有对应权限,1表示有。然后将二进制转换为八进制,为什么是八进制呢?因为三个二进制为一组,故采用这种八进制方案。
例如
拥有者:rw- 110 6
所属组:rw- 110 6
其它人:r-- 100 4
文件权限用八进制方案表示:664
故我们也可以这样使用chmod指令
chmod 664 test.txt
七.文件的默认权限
这是新创建的三个目录和普通文件 ,权限没有经过任何修改,可以发现目录的默认权限是775,普通文件的默认权限是664。
要弄清楚背后的逻辑,需要知道三个点
1.目录的起始权限是777,普通文件的起始权限是666
那为什么目录的的权限不是777呢?别着急,往下看
2.Linux系统中存在权限掩码
什么是权限掩码呢?我们可以用以下指令来查看
umask
默认的权限掩码是0002,我们还可以自己设置掩码
umask 0000
将掩码更改后我们再创建目录和文件
结果发现目录的默认权限变成了777,普通文件变成了666,默认权限变了!!!所以我们可以大胆猜测,文件的默认权限受到起始权限和权限掩码影响 。那么具体是如何影响的呢
3.默认权限 = 起始权限 去掉 权限掩码中出现的权限
例如0002这个权限掩码,第一个0是八进制的前缀,所以这是一个八进制数002,转换为二进制就是000 000 010,故others的w权限最终会在起始权限中去掉。而目录的起始权限是111 111 111,经过掩码作用就是111 111 101,即八进制的775。
归纳为一个表达式就是最终权限 = 起始权限 & (~umask)当然既然有位运算,那么肯定要先将八进制转换为二进制。
八.目录权限的特殊说明
1.进入一个目录需要什么权限?
答:需要该目录的x权限
2.目录的r权限是什么?
答:查看当前目录的文件列表(ls指令)
3.没有目录的x权限,但是有r权限,能拥ls指令查看文件列表吗?
答:不能,没有x权限则无法对目录执行任何命令,甚至无法进入
4.在一个目录下创建文件需要什么权限?
答:需要该目录的w权限
5.一个文件的属性能否被查看由什么决定?
答:由文件所属目录的权限决定!!!
6.一个文件能否被删除本身能决定吗?由谁决定?
答:不能,由文件所属目录与对应账户是否有w权限
辨析上面几个问题后,我们就能理解为什么要把目录的起始权限设为rwx了,你既然创建了一个目录,肯定要能进入吧,要能创建文件吧,还要能查看文件列表吧,不然你创建它干什么呢?
但同时有一点令人匪夷所思,我们发现删掉一个文件与该文件无关。假如你创建一个文件,把others的所有权限都取消了,正当你以为高枕无忧时,却发现文件被删除了,因为你忘记更改了目录的权限。所以为了防止这种文件被others随意更改的情况,默认的掩码就是0002,无论是目录还是普通文件,都把others的w权限去掉。
还有一个小细节,每个用户的家目录都只对自己开放了权限,其它用户是无法访问的
所以,一般而言,不同的账号是不会在同一目录下的,上面那种others删除文件的情况几乎不会发生
九.粘滞位
1.粘滞位应用场景
上面说的是一般情况,但总会有特殊场景。
张三和李四现在想要合作开发,共享文件,但是文件放在哪里呢?张三的家目录李四进不去,李四的家目录张三进不去。这时root说,我在根目录下创建了一个目录dir,你们都把文件放在里面吧。于是张三和李四都在dir目录下进行开发,也能互相查看对方的文件。
突然有一天,张三不想让李四看到自己写的内容,于是他把自己文件others的所有权限给关闭了,但是又害怕李四生气把文件给删了,所以张三找到root,让他把李四对dir目录的w权限取消,root答应了。
第二天,李四来找root,你把我的w权限关了,我还怎么新建文件啊!root这下犯了难,不知道该怎么办。
上面问题的根源在于文件能否被删除不由文件本身的权限决定,“毁灭你与你无关”。你取消别人权限可以保证信息不回泄露,但别人不高兴了可以随时删你,但更改目录权限又会引发别的问题,这样显然不合理。
针对这种共享场景下的问题,LInux新增了一个权限,叫做粘滞位。
2.粘滞位的使用方法
共享文件时,大家可以不给对方设置权限,但是可以互删文件,这是有bug的。给共享目录添加了粘滞位后,该目录下的文件只能由以下的人删除:
- 超级管理员
- 文件拥有者
- 目录拥有者
chmod +t dir
给dir目录添加粘滞位