我们已经知道了权限的赋予方式,但是这些读、写、执行权限到底是什么含义呢?有些人可能会说:"你也太小瞧我们了,读、写、执行的含义这么明显,我们还能不知道吗?"其实,这些权限的含义不像表面上这么明显,下面我们就来讲讲这些权限到底是什么含义。
首先,读、写、执行权限对文件和目录的作用是不同的。
权限对文件的作用。
-读(r):对文件有读(r)权限,代表可以读取文件中的数据。如果把权限对应到命令上,那么一旦对文件有读(r)权限,就可以对文件执行 cat、more、less、head、tail 等文件查看命令。
-写(w):对文件有写(w)权限,代表可以修改文件中的数据。如果把权限对应到命令上,那么一旦对文件有写(w)权限,就可以对文件执行 vim、echo 等修改文件数据的命令。注意,对文件有写权限,是不能删除文件本身的,只能修改文件中的数据。如果要想删除文件,则需要对文件的上级目录拥有写权限。
-执行(x):对文件有执行(x)权限,代表文件拥有了执行权限,可以运行。在 Linux 中,只要文件有执行(x)权限,这个文件就是执行文件了。只是这个文件到底能不能正确执行,不仅需要执行(x)权限,还要看文件中的代码是不是正确的语言代码。对文件来说,执行(x)权限是最高权限。
权限对目录的作用
-读(r):对目录有读 (r)权限,代表可以查看目录下的内容,也就是可以查看目录下有哪些子文件和子目录。如果把权限对应到命令上,那么一旦对目录拥有了读(r)权限,就可以在目录下执行 ls 命令,查看目录下的内容了。
-写(w):对目录有写(r)权限,代表可以修改目录下的数据,也就是可以在目录中新建、删除、复制、剪切子文件或子目录。如果把权限对应到命令上,那么一旦对目录拥有了写(w)权限,就可以在目录下执行 touch、rm、cp、mv 命令。对目录来说,写(w)权限是最高权限。
-执行(x):目录是不能运行的,那么对目录拥有执行(x)权限,代表可以进入目录。如果把权限对应到命令上,那么一旦对目录拥有了执行(x)权限,就可以对目录执行 cd 命令,进入目录。
注意事项
初学权限的时候,可能对两种情况最不能理解,我们一个一个来看。
1) 为什么对文件有写权限,却不能删除文件?
这需要通过分区的格式化来讲解。我们之前讲过,分区的格式化可以理解为给分区打入隔断,这样才可以存储数据。
在 Linux 的 ext 文件系统中,格式化可以理解为把分区分成两大部分:
一部分占用空间较小,用于保存 inode(i 节点)信息;绝大部分格式化为 block(数据块),用于保存文件中的实际数据。
在 Linux 中,默认 inode 的大小为 128 Byte,用于记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件中的数据真正保存的 block 编号。每个文件需要占用一个 inode。
仔细观察,在 inode 中并没有记录文件的文件名。那是因为文件名是记录在文件上级目录的 block 中的。我们画一张示意图看看,假设有这样一个文件 /test/cangls,如图 1 所示。
图 1 inode示意图
我们可以看到,在 /test/ 目录的 block 中会记录这个目录下所有的一级子文件或一级子目录的文件名及其对应的 inode 好。也就是说,系统读取 cangls 文件的过程是这样的:
通过 /test/ 目录的 inode 信息,找到 /test/ 目录的 block。
在 /test/ 目录的 block 中,查看到 cangls 文件的 inode 号。
通过 cangls 文件的 inode 号,找到了 cangls 文件的 inode 信息。
确定是否有权限访问 cangls 文件的内容。
通过 inode 信息中 block 的位置,找到 cangls 文件实际的 block。
读取 block 数据,从而读取出 cangls 文件的内容。
既然如此,那么 /test/ 目录的文件名放在哪里呢?当然放在 / 目录的 block 中了,而/目录的 inode 号(/ 目录的 inode 号是 2)是系统已知的。也就是说,在系统中读取任意一个文件,都要先通过 / 目录的 inode 信息找到 / 目录的 block,再查看 / 目录的 block,从而可以确定一级目录的 inode 信息。然后一级一级地查找到最终文件的 block 信息,从而读取数据。
总结:因为文件名保留在上级目录的 block 中,所以对文件拥有写权限,是不能删除文件本身的,只能删除文件中的数据(也就是文件 block 中的内容)。要想删除文件名,需要对文件所在目录拥有写权限。
2) 目录的可用权限。
对目录来讲,如果只赋予只读(r)权限,则是不可以使用的。大家想想,要想读取目录下的文件,你怎么也要进入目录才可以吧?而进入目录,对目录来讲,需要执行(x)权限的支持。
目录的可用权限其实只有以下几个。
0:任何权都不赋予。
5:基本的目录浏览和进入权限。
7:完全权限。
示例
我们做权限的实验,是不能使用 root 用户测试的。由于 root 用户是超级用户,就算没有任何权限,root 用户依然可执行全部操作。
所以我们只能使用普通用户来验证权限,而目前普通用户又不能修改文件权限(不是普通用户不能修改文件权限,而是只有文件的所有者才能修改文件权限,我们当前没有讲修改所有者的命令,从而导致普通用户不能修改文件权限)。在实验中,笔者会用 root 用户来修改文件权限,而用普通用户 user 来验证权限,请大家注意用户身份的变化。
实验思路:由 root 用户把测试目录和测试文件的权限改为最小(0),然后逐步放大权限,用普通用户来验证每个权限可以执行那些命令。
创建普通用户 user 的简单步骤:第一步,添加用户执行命令"useradd user";第二步,设置用户密码 "passwd user",输入两次密码确认。
#步骤一:由root身份建立测试文件
[root@localhost ~]# cd /home/user/
#进入普通用户的家目录中建立测试目录和文件,因为普通用户无法进入root的家目录中[root@localhost user]# mkdir test
[root@localhost user]# touch test/cangls
#建立测试目录和文件
[root@localhost user]# chmod 750 test/
#修改test目录的权限为750
#由于没有修改所有者和所属组,所以user用户会匹配其他人权限#为了实验效果,只把他人的权限改为0,而所有者和所属组权限不修改[root@localhost user]# chmod 640 test/cangls#修改cangls文件的权限为640
#步骤二:由user用户测试权限(执行命令"su-user"切换用户)[user@localhost ~]$ ll
总用量 4
drwxr-x—-- 2 root root 4096 6月 15 13:19 test#思考:为什么user对test目录没有权限,却能看到 test目录?
[user@localhost ~]$ ls test/
ls:无法打开目录test/:权限不够
[user@localhost ~]$ cd test/
-bash: cd: test/:权限不够
#由于user用户对test目录没有权限(0),所以既不能查看目录下的内容,也不能进入目录#步骤三:由root用户给test目录赋予读(r)权限[root@localhost user]# chmod 754 test
[root@localhost user]# ll test/
总用量0
-rw-r----- 1 root root 0 6月 15 13:19 cangls#注意,这是测试实验,只读(r)权限对目录无法正常使用#步骤四:由user用户测试,读(r)权限虽然可以看到目录下的内容,但是不能正常使用[user@localhost ~]$ ls test/
ls:无法访问test/cangls:权限不够
cangls
#ls查看目录下的内容,虽然看到了文件名,但依然报错"权限不够"[user@localhost ~]$ ll test/
ls:无法访问test/cangls:权限不够
总用量0
-????????? ???? ? cangls
#ll查看目录下的内容,会发现由于权限不足,所以只能看到文件名,其他信息都是"?",代表不能正常查看[user@localhost ~]$ cd test/
-bash: cd: test/:权限不够
#当然也不能进入目录
#所以,只读(r)权限对目录来说是无法正常使用的权限#步骤五:由root用户给test目录赋予读(r)和执行(x)权限[root@localhost user]# chmod 755 test
[root@localhost user]# ll test/
总用量0
-rw-r—---- 1 root root 0 6月 15 13:19 cangls#读(r)和执行(x)权限对目录来说才是可以正常使用的权限#步骤六:由user用户测试
[user@localhost ~]$ ll test/
总用量0
-rw-r—---- 1 root root 0 6月 15 13:19 cangls#可以正常查看目录下的内容
[user@localhost ~]$ cd test/
[user@localhost test]$
#可以进入目录了
#步骤七:我们开始测试文件权限,由user用户测试[user@localhost test]$ cat cangls
cat: cangls:权限不够
#user用户没有读(r)权限,所以不能查看文件的内容[user@localhost test]$ echo 22222 >> cangls-bash: cangls:权限不够
#user用户没有写(w)权限,所以不能写入数据
#步骤八:由root用户给cangls文件赋予读(r)权限[root@localhost user]# chmod 644 test/cangls#步骤九:由user用户测试,可以读取cangls文件的内容[user@localhost test]$ cat cangls
[user@localhost test]$
#虽然文件为空,但是不再报错
[user@localhost test]$ echo 22222 >> cangls-bash: cangls:权限不够
#由于没有写权限,所以依然不能向文件中写入数据#步骤十:由root用户给cangls文件赋予写(w)权限[root@localhost user]# chmod 646 test/cangls#这只是实验,才会出现其他人权限高于所属组权限的情况,实际情境不会这样#步骤十一:由user用户测试,可以对cangls文件写入数据[user@localhost test]$ echo 22222 >> cangls[user@localhost test]$ rm -rf cangls
rm:无法删除"cangls":权限不够
#可以对cangls文件写入数据,但是不能删除这个文件本身#步骤十二:由root用户给test目录赋予写(w)权限[root@localhost user]# chmod 757 test/
[root@localhost user]# ll
总用量4
drwxr-xrwx 2 root root 4096 6月 15 13:19 test#其他用户赋予7权限,非常不安全,在生产环境下严格禁用#步骤十三:由user用户测试,可以删除cangls文件,并且可以新建、复制和剪切[user@localhost test]$ rm -rf cangls
#可以删除
[user@localhost test]$ touch bols
#可以新建bols文件
[user@localhost test]$ mv bols Imls
#可以把bols文件改名为lmls
这个实验并不复杂,但是由于需要在两个用户身份之间切换,所以代码确实比较长。这个实验可以充分说明每个权限可以执行哪些命令,可以帮助我们更好地理解权限的含义。
》》》更多的关于linux培训知识,欢迎随时咨询传智播客网站右下侧咨询窗口《《《