【Linux权限管理】文件:毁灭我与我无关

一.预备知识

1.LInux用户分类

一台Linux机器的用户分为两类:

超级用户和普通用户

注意我这里说的用户的并不是一个固定的人,例如你本身就有root账号,但你也可以使用自己创建普通账号。当你使用root账号时,你就是一个超级用户,当你使用普通账号时,你就是一个普通用户。更简单地说,这里的用户对应的是正在使用的账号。

root账号无所不能,不受权限约束,而普通账号则受权限约束。具体怎么一回事下面再说。

2.切换用户的指令

当你想切换到不同用户时,可以使用su指令,后面加上想要切换成哪个用户,如果不加,默认是root用户

从普通用户切换到超级用户:

su

接下来会提示你输入密码,这里输入的是root账号的密码。

从超级用户切换到普通用户:

su zhangsan

假设你添加了zhangsan这个用户,就可以使用本条指令切换用户,root用户可以任意切换身份,不需要输入密码

从普通用户切换到普通用户

su lisi

假设你现在登录的是张三的账号,你想要切换成李四,就可以使用上述的命令,前提是你要知道李四的密码

su -

你也可以使用这条指令切换账号,他和su的效果基本一样,只不过su只是单纯地账号切换,而su -是重新登录账号,最终的效果就是前者仍然在以前的目录,而后者会回到切换账号的家目录

二.权限的理解

怎么理解权限?权限就是能不能做某件事,它是一个是否的问题,所以权限必然包含两个要素,谁能不能做事?(who)   做什么事?(what)

Linux系统当中,“一切皆文件”,故我们操作一台机器,实际上就是访问机器当中的各种各样的文件。所以我们说,“权限是伴生文件的”,某个具体的文件(这里是广义的文件,包括目录等),权限就是约束用户对文件能做哪些事情。

三.文件访问者的分类

根据和某个文件的关系,所有用户可以被分为三类:

  1. 拥有者 u--User
  2. 所属组 g-Group
  3. 其它人 o-Others

拥有者默认就是创建这个文件的人

所属组是专门为这个文件划的一个群体,里面可以有一个或多个用户,并且有一个组长,最初默认只有文件的创建者一个人,并且担任组长、

这里可能会有一个疑问,不是说用户分为超级用户和普通用户吗?这里不是和上面冲突了吗?

超级用户和普通用户是某个具体的人,而拥有者,所属组和other是某种角色,二者是相互补充,互相成就的关系。

例如,张三是一名学生,想去教职工食堂吃饭但是被拦住了。于是张三奋发图强,大学毕业后当上了老师,可以正大光明地去教职工食堂了。张三能去教职工食堂吃饭,是因为他是张三吗?不是,是因为他是老师。张三从学生这个角色向老师转变,但他的姓名,身份证号没有改变,从他出生起,他就叫张三。所以我们说张三这个人的角色先是学生,后是老师。

四.文件类型和访问权限

我们可以使用ls -l 指令来查看当前目录下所有文件的属性,一个文件的属性如下

【Linux权限管理】文件:毁灭我与我无关_第1张图片

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

功能:设置文件的访问权限

【Linux权限管理】文件:毁灭我与我无关_第2张图片

chmod u+x test.txt

给test.txt文件的拥有者加上x权限

【Linux权限管理】文件:毁灭我与我无关_第3张图片

chmod u-x,o+w test.txt

给test.txt文件的拥有者取消x权限,others加上w权限 

【Linux权限管理】文件:毁灭我与我无关_第4张图片

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

七.文件的默认权限

【Linux权限管理】文件:毁灭我与我无关_第5张图片 

 这是新创建的三个目录和普通文件 ,权限没有经过任何修改,可以发现目录的默认权限是775,普通文件的默认权限是664。

要弄清楚背后的逻辑,需要知道三个点

1.目录的起始权限是777,普通文件的起始权限是666

那为什么目录的的权限不是777呢?别着急,往下看

2.Linux系统中存在权限掩码

什么是权限掩码呢?我们可以用以下指令来查看

umask

默认的权限掩码是0002,我们还可以自己设置掩码

umask 0000

 

将掩码更改后我们再创建目录和文件

【Linux权限管理】文件:毁灭我与我无关_第6张图片 结果发现目录的默认权限变成了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的。给共享目录添加了粘滞位后,该目录下的文件只能由以下的人删除:

  1. 超级管理员
  2. 文件拥有者
  3. 目录拥有者

 chmod +t dir

给dir目录添加粘滞位 

【Linux权限管理】文件:毁灭我与我无关_第7张图片

你可能感兴趣的:(linux,运维,服务器,c++)