最近看了《鸟哥的Linux私房菜》之后,对文件的权限管理有了新的认识,对文件和目录的权限也有了系统的认知,其中最让我容易混淆的就是“x”权限了!
1.用户和用户组
在我们要学习文件权限的时候,用户和用户组是一个非常基础并且比较重要的概念,这里其实还有个“第三者”,也就是其他人的概念。
由于Linux是个多人多任务的系统,因此可能常常会有很多人同时使用一台主机来进行工作的情况发生,为了考虑到每个人的隐私权和每个人喜好的工作环境,因此文件拥有者(用户)相关的权限设置就显得相当重要。
下面通过一个例子来阐述文件拥有者,用户组以及其他人的概念:我们在教室里学习的时候,每个人拥有自己的桌子,同时教室里有很多同学和你一起学习,这时候你拥有自己的桌子,这里的桌子就相当于一个文件,而你就是这个桌子的拥有者。教室就相当于是一个用户组,其他同学就被称为组内成员。其他班的学生就是其他人。
下课的时候,同班同学或者其他班的同学想要看你的桌子的时候就要经过你的意见,这里的意见就是设置权限。当然了,没有你的同意别人是不可以打开你的抽屉查看的,如果里面有你的隐私东西(情书、日记之类的),别人如果强行要看你就可以K他的!哈哈!
但是学校是一个大的集体,不可能只有一个班级,所以会有很多年级很多班,也就是说在我们的Linux操作系统中:每个账号可以有多个用户组的支持
2.Linux文件权限概念
大致了解了Linux的用户和用户组之后,接下来我们聊一下,对文件(桌子)的权限要如何针对这些所谓的用户和用户组来设置呢?
2.1Linux文件属性
要设置文件,首先了解一下文件权限的基本情况,那么怎么查看文件呢?这时有个重要的也是常用的命令[ls]命令。ls的意思是list,重点在显示文件的文件名与相关属性,当直接输入ls的时候,显示的是我们平时写的文件以及文件夹,要查看文件的属性要在后面加“-al”,表示列出所有的文件详细的权限与属性(包括隐藏文件,就是以.开头的文件)
从上图可以看到,每一行显示的信息就是一个文件的详细信息,每一行有9个字段:
- 第一栏代表这个文件的类型和权限(Permission)
这一栏里面有10个字符,这10个字符分别代码的意思是:
- 第一个字符代表的是这个文件的目录、文件或链接文件等:当为[d]则是目录,当为[-]则为文件,当为[l]则表示为链接文件(link file),若是[c]则表示为设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备),若是[b]则表示为设备文件里面的可供存储的周边设备(可按块随机读写的设备)
- 接下来的字符中,以三个为一组,且均为[rwx]的三个参数的组合,其中,[r]代表可读,[w]代表可写,[x]代表可执行。要注意的是这三个权限的位置不会改变,如果没有权限就会出现[-]。
- 第一组为文件拥有者可具备的权限,以[APUE-study]这个文件为例,第一个字符是[d],则表示这是一个目录,然后文件拥有者的权限就是[rwx],也就是可读可写可执行。
- 第二组为加入此用户组之账号的权限,也就是上面提到的同班同学的权限,这里的权限是[r-x],表示有可读可执行权限。
- 第三组为非本人且没有加入本用户组的其他账号的权限,也就是其他班的同学,这里的权限同样是[r-x],表示有可读可执行权限。
然后后面的第二栏表示有多少文件名链接到此节点(inode):每个文件都会将它的权限与属性记录到文件系统的inode中,不过,我们使用的目录树却是使用文件名来记录,因此每个文件名就会链接到一个inode,这个属性记录的就是有多少不同的文件名链接到相同的一个inode号码。
第三栏表示这个文件(或目录)的拥有者账号
第四栏表示这个文件的所属用户组
第五栏为这个文件的容量大小,默认单位是Bytes
第六、七、八栏为这个文件创建日期或者最近修改的日期
第九栏为这个文件名,这里比较特殊的就是如果文件名之前多了一个.那么这就是一个隐藏文件,直接用ls命令查看不到,需要加[-a]。
这九个字段的内容很重要的,特别是第一栏中的9个权限,那是整个Linux文件权限的重点之一!需要注意的是这里除了直接用[rwx]表示之外也可以用数字表示权限,这里的三个权限都在时用二进制表示为111,转换为十进制就是7,哪个权限没在就设为0。上面的[APUE-study]这个文件的权限也可以表示为755。
2.2如何修改文件属性和权限
要修改文件属性和权限,有几个常用的命令供我们使用:
- chgrp:修改文件所属用户组
- chown:修改文件拥有者
- chmod:修改文件的权限,SUID、SGID、SBIT等的特性
现在我们来分别聊聊三个命令的使用:
- 修改所属用户组,chgrp
修改一个文件的用户组其实挺简单的,直接使用chgrp命令来修改就可以了,这个命令其实就是change group的缩写,这样就好记了。不过要被修改的组名必须在/etc/group文件中存在才行。
- 修改文件拥有者,chown
修改文件拥有者的命令和修改所属用户组的命令类似,也就是change owner,缩写一下就是chown。要注意的是,用户必须是已经存在系统中的账号,也就是在/etc/passwd这个文件中有记录的用户名称才能修改!
chown的用途还有一个就是可以顺便直接修改用户组的名称。此外,如果要连目录下的所有子目录或文件同时更改文件拥有者的话,直接加上-R的选项即可!
- 修改权限 chmod
文件权限的修改使用的是chmod命令,设置权限的方法也有两种,分别可以用数字或者是符号来进行权限的修改。
用数字的时候,我们上面说到权限的表示可以用数字表示,即如果权限都有的话就是777,这时要改变权限或者给一个文件或文件夹设置权限的话就可以直接用权限表示!
如图所示,这里的[.fork]文件修改之前是664,在使用chmod命令后就变成了777,需要注意的是如果修改的是一个文件夹或者目录的话,就需要加[-R]选项才可以递归的把下层的子目录或文件修改。
使用符号类型修改权限的时候我们要先搞懂几种符号代表,即用户(user)、用户组(group)、其他人(others)、全部(all),这里分别用它们的首字符来代表,即u、g、o、a。
在使用的时候,只要将相对应的+、-、=运算r、w、x权限就可以了,比如:
在修改之前是全部没有x权限的,chmod之后就可以看到都有了x权限了,其他的修改也是一样的,只要加上相应的权限就可以了。
3.目录与文件的权限意义
3.1权限对文件的重要性
文件是实际含有数据的地方,包括一般的文本文件、数据库文件、二进制可执行文件等,因此,权限对于文件来说,它的意义是这样的:
- r(read):可读取此文件的实际内容,如读取文本文件的文字内容等;
- w(write):可以编辑、新增或是修改该文件的内容(但不含删除该文件);
- x(execute):该文件具有可以被系统执行的权限。
这里的r和w权限都好理解,就是读和写嘛,但是x权限就很重要了,在windows系统下面一个系统是否具有执行的能力是由扩展名来判断的,例如:.exe、.bat、.com等,但是在Linux下面,我们的文件能否被执行,则是借由是否具有[x]这个权限来决定,跟文件名是没有绝对关系的。
3.2权限对目录的重要性
文件是存放实际数据的存在,那么目录主要的内容就是记录文件名列表,文件名与目录有强烈的关联,所以如果是目录时,各个权限是啥意思呢?
- r(read contents in directory):表示具有读取目录结构列表的权限,所以当你具有读取®一个目录的权限时,表示你可以查询该目录下的文件名数据,所以你可以用ls这个命令将该目录的内容列表显示出来。
- w(modify contents of directory):这个可写入的权限对目录来说是很了不起的,因为它代表你具有改动该目录结构列表的权限,即:
- 建立新的文件与目录;
- 删除已经存在的文件与目录(不论该文件的权限是什么);
- 将已存在的文件或目录进行更名;
- 移动该目录的文件、目录位置;
总之,目录的w权限就与该目录下面的文件名的变动有关。 - x(access directory):目录的执行权限,目录只是一个记录文件名的地方,不可以拿来执行,那么这个执行权限到底是啥意思呢?其实目录的x代表的是用户能否进入该目录成为工作目录的用途,所谓的工作目录就是你目前所在的目录。举例来说,当你登陆Linux时,你所在的家目录就是你当前的工作目录,而变换目录的命令是
cd XXX
。