Linux中每个文件都有一个特定的拥有者(一般是创建它的用户)和所属用户组,这是它的固有属性。文件可以利用这两个固有属性来规定它的拥有者或者是所属用户组内的用户是否拥有对它的访问权利,即读、写和执行的权利。此外为了提高适应性,文件还规定了其他不相关的人等的访问权限,也就是第三个固有属性。这三个固有属性和三个权利合起来,就构成了文件针对系统中所有用户的访问控制,也就构成了Linux中的文件权限体系。
1.2 单独拿出一行来分析,结果如下:
1.3 文件权限和类型(图1中的第1个字段)
这些属性当中最重要的就是前面的文件类型和权限了,那么rwx代表什么呢?详见下图:
Linux中的权限控制是当某个用户需要访问某个文件时,系统就读取这个文件的属性和权限信息与当前的UID和GID进行对比,来确定当前用户是文件的拥有者还是其所属组的用户,或者是毫无关系。然后根据这些比对结果和用户执行的动作来判断是否满足权限要求。这也引出了文件权限与命令的一些关系,因为Linux系统中一个文件是否为可执行文件是通过属性来决定的,而不是后缀名。
首先说说“r”权限,顾名思义(read简写)
对目录而言,“r”表示的是遍历目录中的所有文件名和子目录名,仅仅是遍历文件名而已,并不是实际内容。
#######这说明“r”权限在目录中的控制作用,要查看目录中文件列表,必须具有“r”权限
对于文件而言,“r”表示的是遍历文件中的实际内容,文件中不管有没有内容,拥有“r”权限,在操作的时候都会去遍历一遍。
######这就是“r”权限对于文件的访问控制
######执行者要查看文件的内容,就必须具有该文件的“r”权限
接着说说“w”权限,(write的简写)
对目录而言,“w”权限就是说可以在该目录中修改信息,什么是修改信息呢?在目录中信息就是各种文件的名称,修改信息就是与该目录下的文件名或子目录名的变动有关的操作,注意:指的是名字。具体如下:
#######这就是“w”权限对在目录中添加文件的控制作用
#######要在目录中创建文件,执行者必须拥有该目录的“w”权限
2)删除该目录下已经存在的文件或子目录(不论该文件或子目录的权限如何),注意:这点很重要,用户能否删除一个文件或目录,看的是该用户是否具有该文件或目录所在的目录的w权限。
######这就说明了“w”权限对删除目录中文件的控制作用
######要删除目录中的文件,执行者必须具有该目录的“w”权限
#####这就说明“w”对目录中文件名的控制作用,执行者要修改目录下的文件名,必须拥有“w”权限
#####这就说明“w”权限对移动目录的控制,其实就和删除是一样的,
#####只要文件要离开这个目录,就必须有“w”权限
对文件而言,“w”权限是对文件内容的控制,只要修改文件内容,就必须要有“w”权限,比如vim,echo等命令对文本的修改,执行者就必须有“w”权限,否则是不可以编辑文件的!
再说说“x”权限,(exec简写)
对于目录文件,“x”权限控制用户是否能打开它,只有具备了“x”权限,才能打开目录。而要查看目录下的内容,就必须有“r”权限,即查看显示的相关命令都必须具有文件的“r”权限才可以访问文件,比如ls命令,要显示ls对目录文件的执行结果,执行者必须具有该文件的x和r权限,毕竟是先打开(x),再显示(r)嘛。
例如:1.创建目录文件day001,看出默认创建目录文件权限是775
2.在该目录中创建文件a.txt和b.txt,看出默认创建文件权限是:661;执行ll命令会显示出a和b文件
3.我们去掉目录day001的“rw”权限,再执行cd命令和ll命令,看看结果:
#####对于目录而言,“x”权限就是一个开关,执行者拥有这个目录的开关“x”,才能进入该目录
1.4 修改文件基本权限:
其实Linux文件权限除了“r”、“w”、“x”外,还有“s”、“t”两种权限。只不过“s”和“t”比较特殊,是建立在“x”权限基础上的,它们与操作系统的账号和系统进程相关。
“s”和“t”存在的必要条件是相应的“x”权限必须存在。“s”这个标记可以出现在文件拥有者的x权限位上,也可以出现在文件所属组的x权限位上。那么其他用户位上的“x”权限位是否也可以被取代呢?答案是肯定的,只不过不再是“s”取代,而是“t”去取代,如下图:
从上命令结果,能够看到su这个命令的文件权限是“-rws r-x r-x”,拥有者的“x”权限位上是“s”,这就是SUID了,SUID权限拥有这样的功能:
1).SUID仅对二进制程序有效
2).执行者对该程序有“x”权限
3).执行权限仅在执行过程中有效
4).执行者将具有该程序拥有者的权限
su这个命令,无论任何人,执行它的瞬间都将拥有root权限,因为su命令的拥有者是root,只是这个权限仅在执行su命令时有效。这也是su命令能切换用户的原理。
设置SUID的方法就是使用“u+s”来改变权限。SUID在Linux中是非常常见的,那些需要提供给普通用户,但又需要root权限才能正常运行的程序,基本上都拥有SUID,比如:passwd,mount等,这也是实际用户和有效用户不一致的触发条件。
从上述命令结果看出,locate命令的文件权限是“rwx --s --x”,这就是SGID,拥有SGID的权限有:
2).执行者对该程序有x权限
3).执行者在执行过程中将会获得该程序所属用户组的支持
SGID除了用在二进制程序上,还可以用在目录上。当一个目录设置了SGID权限后,它将具有如下功能:
1).用户若对此目录拥有“r”和“x”权限时,该用户能够进入此目录查看文件名
2).该用户在此目录下的有效用户组将变成该目录的用户组。若用户在此目录下具有“w”的权限,则用户所创建的新文件的用户组与此目录的用户组相同。
根据这一特性,进入这类目录的用户就会发生有效用户组和实际用户组不一致的情况。而另一种导致有效用户组与实际用户组不一致的情况是使用newgrp命令。而有效用户组所起到的作用就在于其创建文件时文件的用户组。
####这就是“s”权限对于目录的控制作用!
如上命令结果看出,/tmp文件就是“rwx rwx rwt”权限,也就是SBIT。仅对目录有效。对目录的作用如下:
1).用户若对此目录有“w”和“x”的权限,即拥有写的权限(这和普通目录一样)
2).当用户在此目录下建立了文件或目录,仅自己或root才有权利删除文件(这也和普通目录一样)
换句话说就是:当用户U在目录D下建立了文件F,若D拥有SBIT权限,则仅用户U和root可以删除文件。
SBIT应用的典型例子就是/tmp目录。
###测试“t”查找的时候,普通用户是否可以删除其他用户的文件
####这就看出了“t”权限对于删除文件的文件限制!普通目录只要有“wx”就可以删文件。