前言
首先我们需要知道Linux最优秀的一个地方在于它的多人多用户环境。而为了将各个用户具有各自保密的文件数据,因此文件权限管理就显得格外的重要。
- Linux一般将文件的可读写的身份分为三个类别,分别是所有者(user),所属群组(group),和其他人(other),而每种身份又有着对文件的三种权限,分别是读(read),写(write),和执行(execute)。
除此之外,有一些文件还会具有特殊的权限,在这里就不过度展开了。就让我们进入今天的正题吧,来讲一讲这些具体的文件类型与权限。
Linux的文件类型
Linux中还有一个概念叫做“一切皆文件”,Linux中的一切文件都可以由以下七种文件构成,它们分别是:
文件种类 | 用途 | 权限符号表示 |
---|---|---|
常规文件 | 这是Linux中最多的一种文件类型,文件中的内容大多数都是我们人类可以直接去读取的数据,它们中又可以细分为,纯文本文件,二进制文件和数据文件 | - |
目录 | 作为一个目录 | d |
链接文件 | 类似与Windows里面的快捷方式,Linux中关于链接又分为硬链接与软链接 | l |
块设备文件 | 当你往Linux主机中插入一个U盘等具有存储空间的硬件时,你的Linux中就会多出一个文件,这个文件叫做区块设备文件(block)。 | b |
字符设备文件 | 当你往Linux主机中插入一个鼠标或键盘等没有存储空间的硬件时,你的Linux中也会多出一个文件,这个文件叫做字符设备文件(char) | c |
套接字文件 | 这一类文件涉及网络上的数据交换 | s |
管道文件 | 管道文件的主要目的是解决多个文件同时读取一个文件所造成的错误问题 | p |
讲完了Linux中的七类文件表示后,我们再来讲文件的权限。
Linux文件的普通权限
当我们在命令行输入命令:ls -l 后,我们会看到这样的信息:
drwx------ 6 root root 4096 10月 21 20:40 root
-rw------- 1 root root 993244160 6月 19 2022 swapfile
dr-xr-xr-x 13 root root 0 2月 2 11:11 sys
drwxrwxrwt 17 root root 4096 2月 17 17:52 tmp
drwxr-xr-x 11 root root 4096 9月 16 2021 usr
drwxr-xr-x 14 root root 4096 9月 16 2021 var
lrwxrwxrwx 1 root root 30 1月 21 06:57 vmlinuz -> boot/vmlinuz-5.4.0-137-generic
lrwxrwxrwx 1 root root 30 1月 21 06:57 vmlinuz.old -> boot/vmlinuz-5.4.0-136-generic
结合我们刚刚所说的,你大概就能看懂最左边这一列数据所代表的意思。
-
最左边这一列一共有着10个字符,第一个字符代表着文件的种类,后面9个字符,每3个为一组,分别代表着用户,所属群组,其他人关于读、写、执行和某些特殊权限的拥有情况。
-
r代表着拥有读权限,w代表着拥有写权限,x代表拥有执行权限。如果一组中没有以上的条件了话,会用 - 字符去代替。
-
还有一些特殊权限如SUID、SGID、SBIT ,这里则不去过多介绍,这里只介绍文件所拥有的三种普通权限,读,写和执行。
设置文件的权限
我们先说好,r(只读)的属性值为4,w(只写)的属性值为2,x(执行)的属性值为1。这是Linux系统所去规定的。
- 我们在Linux中的一个文件,它共有三种身份,分别就是文件拥有者,所属群组和其他人。每种身份都具有我们上述所说的3种属性值。每个身份我们可以用一个8进制的位数去表示。拿这个文件举例,我们该怎么去表示它文件的权限属性呢?
-rw-rw-r-- 1 nowcoder nowcoder 11 2月 17 17:09 a.txt
答案是:0664
-
首先,我们用一个8进制数去表示这3种身份的文件信息,每一个8进制位代表一个身份,如果这个身份只有读的权限,那这一位就是数字4,如果只能写就是数字2,如果只能执行,那就是数字1,那如果既可以写又可以读,那么加起来就OK了,其他情况也是如此。
-
那么从左数第2位代表文件拥有者所拥有的权限,第三位代表所属群组对文件所拥有的权限,第4位代表其他人对文件所拥有的权限,所以a.txt这个文件就可以用0664来表示它的权限属性。
有些小伙伴不仅要问,那左手边第一位是做什么用的呀,那是特殊权限标志位,也是一个八进制位,后面会讲到的,这里就不多做展开了。
chmod命令
讲完刚刚关于文件的权限属性值后,就可以更好的来讲解这个chmod命令了。
- 我们可以通过chmod命令,来去修改一个文件它相关的属性。我们还是拿a.txt这个文件去举例:
-rw-rw-r-- 1 nowcoder nowcoder 11 2月 17 17:09 a.txt
- 通过我们刚刚所教的知识,我们可以得出 a.txt这个文件其他人对这个文件所拥有的属性是只读的。我们有没有什么方法让它变成其他人也可以对这个文件进行写入操作呢?答案是当然可以。我们输入命令:
chmod 0666 a.txt
- 此时其他人也可以对这个文件进行写入操作了。我们来用ls -l命令查看一下a的属性信息
-rw-rw-rw- 1 nowcoder nowcoder 11 2月 17 17:09 a.txt
- 如我们所料,权限信息发生了改变。
chmod命令其实还有一些其他的玩法,我们这里就不做更多展开了。下面我们由浅入深,来介绍一下文件的默认权限。
文件的默认权限
说到文件的默认权限,我们就不得不提到一个东西,那就是umask码。
那我就来说一下我对umask (用户掩码) 码的理解:
-
假设我们现在在一个工作空间下,我输出umask这个命令,我会得到一串数字,如下例所示:
nowcoder@nowcoder:~/Linux/lession12$ umask 0002
-
这就是这个工作空间的umask码。同样这也是4个8进制的数。那小伙伴可能会产生疑惑了,这和我们刚刚讲的权限有什么关系呢?
别急,请听我慢慢道来。 -
我们都知道,权限和umask码都是由4个8进制的数表示而成,比如a.txt的权限是0664,lesssion12这个工作空间(文件夹)的umask码是0002,这能有什么联系?
那如果我们将umask码和a.txt的的每一个八进制数转换成对应的二进制数再连在一起呢?能不能看出点东西来?umask: 0002 -> 000 000 000 010 -> 111 111 111 101
a.txt: 0664 -> 000 110 110 100
-rw-rw-r-- 1 nowcoder nowcoder 11 2月 17 17:09 a.txt
drwxrwxr-x 3 nowcoder nowcoder 4096 2月 18 16:06 lession12 -
ok,这个时候大家是不是产生出了,奥我好像有点懂了的想法,别急,你还没懂完全。
-
我们可以看出,umask码与a.txt它们都是由12个二进制位组成,后9位,就可以对应相应的三种身份的三种权限。我们来对比一下后9位:
对应a.txt来说,有这种权限,那么这个二进制位就是1,没有那就是0。
对应umask码来说,有这种权限,那么这个二进制位就是0,没有则就是1。 -
这样拆开来看,大家是不是就懂得更多啦?如果我们设置文件权限要这么一个个二进制位的去设置,肯定太麻烦,所以Linux系统,将每3个二进制位合成一个8进制位,去表示一种身份的三种权限的有无,就显得十分巧妙了。
-
再谈回umask码,lession12这个文件夹的umask码是0002,那就代表着这个文件夹下,如果你再创建子文件夹,那这个子文件夹的其他人身份就会少一个x(写)的权限,那么它的权限表示就是0775。
-
至此,我们就可以推出umask码的真实定义:
用户掩码(umask)的作用是用户在创建文件时从文件的默认权限中去除掩码中的权限。
使用umask命令,你看的只是只是创建一个文件夹会抹除哪些权限,但不会显示创建一个文件会抹除哪些权限。
因此,就需要你自己去创建一个文件,由它的权限去反推创建一个文件时它的umask码是多少。如下例所示:
nowcoder@nowcoder:~/Linux/lession12$ touch b.txt
nowcoder@nowcoder:~/Linux/lession12$ touch c.txt
nowcoder@nowcoder:~/Linux/lession12$ ls -l
总用量 16
-rw-rw-rw- 1 nowcoder nowcoder 46 2月 18 16:05 a.txt
-rw-rw-r-- 1 nowcoder nowcoder 0 2月 18 16:48 b.txt
-rw-rw-r-- 1 nowcoder nowcoder 11 2月 17 17:08 c.txt
我们从这个图中就可以得出创建一个新的空文件它的默认权限是0664,由此可以推出这个工作空间下,创建文件的umask码为0223。
ok,到这里我们可以稍微总结一下,这一小节的知识:
umask(用户掩码)的作用是用户在创建文件时从文件的默认权限中去除掩码中的权限。
🔴🔴🔴在Linux中使用umask命令,你看到的是关于这个创建文件夹(目录)的默认umask码。不是关于创建所有文件的umask码,请谨记!!!
目录文件与其他文件的权限意义区别
对于除目录外的其他文件,其r、w、x的权限很好理解,也就是对这个文件的读,写和可执行权限。
那么如果说要一个目录文件拥有写,与执行权限,你是不是就会觉得怪怪的?我要对这个这个目录写什么?执行什么呢?所以你的感觉是没有错的。目录权限同样的rwx权限相对于其他的文件确实有着不一样的解释。
下面是目录r、w、x的权限作用:
-
r (read contents in directory)
表示具有读取目录结构的权限,当你具有读取一个目录的权限(r)时,表示你可以查询该目录结构下的文件名数据,简单通俗点说,你可以知道这个文件夹里装了哪些文件。
-
w (modify contents of directory)
表示你可以改动这个目录的目录结构,简单点说就是你拥有对这个目录下的文件,子目录进行删除,移动,创建,重命名的权利。你可以执行这些操作。
-
x (access directory)
字面意思,拥有访问目录的权利。把一个目录比作一个宝箱,而目录里装着的东西,便是宝箱里的宝藏,这个x权限就是宝藏的钥匙🔑。如果你对宝箱没有钥匙,那你怎么打开宝箱查看宝箱里有什么宝物,或拿走宝物,又或往宝箱里塞点东西呢?
总而言之,对于一个目录而已,最重要的便是 x 的权限,如果你对一个目录没有 x 的权限,那么你拥有 r 与 w 也没有用。只能当个摆设。简单点说,如果对目录没有x权限,则不能对这个目录进行ls,cd操作。对目录内的文件进行ls,cd,mv,vim等所有操作。
总结
这篇文件介绍了Linux系统中所有的文件类型,文件的基础权限,以及umask码的作用是什么还有目录文件权限与其他文件的权限有什么区别。对于文件的特殊类型与隐藏类型,本文中没有展现,阿宋会在其他的文章中再去单另聊聊它们的。