一、用户与用户组
为了更好地理解文件权限,我们需要先有用户和用户组的概念。因为在Linux里面,任何一个文件都具有“User(用户)、Group(用户组)及Others(其他用户)”3种身份的个别权限。
1、用户和文件所有者的概念
你用来登陆Linux主机的那个用户名就是一个用户,例如,root就是一个用户,而Linux上存在很多的用户。如果你在Linux上创建了一个文件,那么默认情况下你就是这个文件的所有者。
2、用户组的概念
有了用户就可以区分不同的文件的所有者,也可以根据文件的所有者来限定用户可不可以对文件进行读写或执行等操作,那为什么还要有用户组的概念呢?
原因很简单,就是让一些指定的用户(非文件所有者),也能按照一定的权限访问你的文件,而其他的人则不能访问你的文件。而且设置用户组也使这种权限的管理变得容易。
举个例子来说,一个团队A在进行项目开发,你是团队A的成员,则你写的文档或者代码,你的其他成员也需要能对其进行读写,则可以把团队A的人加进一个用户组,这个用户组的人可以对这些文件进行读写,而其他的开发团队,在没有允许的情况下,是不能对你的团队的代码和文档进行阅读和修改。此外,每个用户可以有多个用户组的支持。
3、其他用户(Others)的概念
既然文件有所属的用户组的话,那必然就有一些人是既不属于这个用户组,也不属于文件所有者本身的用户,例如上面例子中除团队A之外的其他的开发团队的用户,就是属于文件的其他用户。
二、Linux文件属性
在自己的主文件夹下,执行ls命令,得到下面的执行结果:
从上面的结果可以后到,屏幕上出现了7列数据,它们分别代表:
权限 连接数 所有者 用户组 文件容量(B) 修改日期 文件名
1、详细解说第一列——权限
可以看到第一列都是由10个字符组成,如下图所示:
第一个字符表示文件类型,接下来的字符中,以3个为一组,且均以“rwx”的3个组合(r:read(可读),w:write(可写),x:execute(可执行)),无论是所有者对文件的权限、用户组对文件的权限还是其他用户对文件的权限,都是rwx,这个顺序是不会变的,如果可读、可写、可执行,则相应的位置就分别为r、w、x,否则为-。
第一个字符表示文件类型,而文件类型主要有:
[d]:目录
[-]:文件
[l]:连接文件
[b]:设备文件里面的可供存储的接口设备
[c]:设备文件里面的串行端口设备
对于权限是怎么理解的呢?举个例子吧,如果第一列为-rwxr-xr--,则表示:该文件为普通文件,对文件所有者可对其进行读写和执行,而用户组的成员,则只能对它进行读和执行,而不能写(修改),其他的用户则只能进行读操作。
而权限的设置除了可以用字母来表示之外,还能用数字表示,对照为r:4,w:2,x:1,-:0(化成二进制可知,其符合前缀码规则),而显示时,只显示每组的累加值,如上例rwxr-xr--可以表示为754。
2、详细解说目录与文件权限的区别
对于用惯了windows的我们来说,并不是每一个文件都是可执行的,它与文件的后缀有关,可执行文件的后缀为.exe,而在Linux下,一个文件是否可执行,与后缀是没有绝对关系的,而是由文件是否具有“x”这个权限来决定的。
而“w”代表你具有写入、编辑、新增、修改文件内容的权限,却不具备删除该文件本身的权利。rwx主要针对文件的内容。
然而,从上面的文件类型可知,文件类型也可能是目录,那么对一个目录进行写和执行显然是没有意义的,那么它到底意味着什么呢?它与普通文件类型[-]又有什么不同呢?
我们知道,文件是存放实际数据的所在,目录主要的内容是记录文件名列表,文件名与目录有强烈的关联。
所以,对于目录来说,r表示具有读取目录结构列表的权限,可以查询该目录下的文件名数据,例如你用ls命令显示目录的内容列表。
对于目录来说w可以说是强大的,它表示具有更改该目录结构的权限,如新建新的目录和文件,删除已存在的文件与目录(不论该文件的权限如何),将已存在的文件或目录进行重命名,转移该目录内的文件和目录位置等。
你可能会觉得x对于一个目录来说总是怪怪的,但是它却是非常有用的,目录的x表示用户能否进入该目录成为工作目录,如是否能使用cd命令切换到该目录下。
值得注意的是:如果你对一个目录具有r权限而没有x权限,你能使用ls查看目录下的文件列表,却不能进入到该目录,也就不能对目录里的任何文件进行操作,即使你对目录中的文件具有rwx权限。
3、文件特殊权限:SUID,SGID,SBIT
当我们执行如下的ls命令时,我们可能会看到很奇怪的结果:
在第一列,中我们看到了上面介绍之外的文件权限属性,s和t。
1)SUID
当s这个标志出现在文件所有者的x权限上时,如上面的第二个例子,则被称为Set UID,简称SUID的特殊权限。
基本上SUID具有如下的限制和功能:
a、SUID权限仅对二进制程序有效,不能用在shell script上面,对目录也是无效的;
b、执行者对于该程序需要具有x的可执行权限;
c、本权限在执行该程序的过程中有效;
d、执行者将具有该程序所有者的权限;
看到这里,可能对于SUID还不是很理解,举上面的例子来说,就是passwd这个程序是root这个用户所有的,并属于root用户组,但是我们知道,对于普通用户,他们还是能够改变自己的密码,这是为什么呢?其原因在于:
1、passwd是一个可执行的二进制程序;
2、这个可执行文件在文件所有者的x权限上的标志是s,即设置了SUID;
3、普通用户对于root用户和root用户组来说是其他用户(Others),然而从文件的权限中我们可以知道,它支持其他用户(Others)对其进行读和执行的操作,
注意,这点很重要,因为如果Others的权限(后三位)设置为r--,则普通的用户就执行passwd这个程序了,即使它在文件所有者的x权限上的标志是s。(注:这个可执行权限要对应用户的角色,在相应的权限中有x的权限,如上面的例子中,无论是文件所有者,用户组,还是Others都具有x的权限。)
4、在执行passwd这个程序时,普通的用户将会获得passwd这个程序的所有者的权限,即root对该程序的权限,而不是Others或用户组的权限;
5、但是这个权限仅在passwd这个程序执行的过程中才有效,程序执行完毕之后,普通用户就不再拥有这种权限了;
2)SGID
相应地,当s出现在用户组的x时则称为Set GID,即SGID。SGID可以针对文件和目录来设置
对于文件来说,SGID有如下限制和功能:
a、SGID对二进制程序有用;
b、程序执行者对于该程序来说,需要备x的权限;
c、执行者在执行的过程中将会获得该程序用户组的支持。
对于文件的权限和操作来说,基本上与SUID相同,只是它获得的不是程序所有者的权限,而是它的用户组的权限。
而SGID可用于目录,对于目录来说,SGID有如下的限制和功能:
a、用户若对于此目录具有r与x的权限,该用户能够进入此目录;
b、用户在此目录下的有效用户组将会变成该目录的用户组;
c、若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。
3)SBIT
SBIT只针对目录有效,它对目录的作用是:
当用户对于此目录具有w,x权限,即具有定稿的权限时,用户在该目录下创建文件或目录,只有自己与root才有权利删除该文件。
三、修改文件权限
修改文件权限的常用命令有:
chgrp:修改文件所属用户组
chown:修改文件所有者
chmod:修改文件的权限
至于这些命令的用法,这里不详述,要用时,可以找一下男人——man。
注:文件的三种特殊权限也可以用数学表示,4为SUID,2为SGID,1为SBIT,如-rwsr-xr-x,按照前面的计算我们知道,原先为755,由于它有SUID特殊权限,所以就变成了4755了。