Linux文件权限详解(新手必看)
文件权限是 Linux 资源访问概念的核心,因为在 Linux 中或多或少都是一个文件。
让我们首先回顾一些术语,然后详细讨论围绕文件访问和权限的元数据表示。
有三种类型或权限范围,从窄到宽:
此外,有三种类型的访问:
我们列出了 r/w/x 作为三种文件访问类型,但在实践中,当你执行 ls 时,会发现其他的文件访问类型:
Linux 中还有一些特殊的设置可以通过 chattr(change 属性)命令来实现。
让我们来看看文件权限的作用(注意,为了更好的可读性,ls 命令输出中的空格已经被扩展了):
当放大文件模式时,也就是说,文件类型和权限在前面的代码段中的 ❼,我们有以下含义的字段:
❶ 其他人的权限;
❷ 组的权限;
❸ 文件所有者的权限;
❹ 文件类型。
文件模式中的第一个字段表示文件类型,具体请参见下表:
文件模式的其余部分编码了各种目标的权限集,从所有者到所有人,如下表所示:
还有一些其他(旧的或过时的)字符,如 M 或 P,用于 0 的位置,你可以基本上忽略。如果你对它们的意思感兴趣,则运行 info ls -n"What information is listed"。
结合起来,文件模式中的这些权限定义了目标集的每个元素(用户、组、其他)所允许的内容,如表所示,通过访问检查和强制执行。
让我们来看几个例子:
664 在我的系统中有特殊的意义。当我创建一个文件时,这是它被分配的默认权限。你可以使用 umask 命令进行检查。
setuid 权限用于告诉系统以所有者的身份运行可执行文件,并具有所有者的权限。如果文件由 root 拥有,就会出现问题。
可以使用 chmod 修改文件的权限。你可以显式地指定所需的权限设置(例如 644),也可以使用快捷方式(例如,+x 使其可执行)。但实际情况如何呢?
让我们用 chmod 创建一个可执行文件:

图 3 使文件可执行以及文件权限如何随其变化
在上图中,你可以看到背后发生了什么。请注意,你可能不想赋予每个人执行该文件的权限,因此在这里使用 chmod 744 可能会更好,只给所有者正确的权限,而不更改其他权限。
你也可以使用 chown(和组的 chgrp)改变所有权:
让我们首先回顾一些术语,然后详细讨论围绕文件访问和权限的元数据表示。
有三种类型或权限范围,从窄到宽:
- 用户:文件的所有者。
- 组:有一个或多个成员。
- 其他:其他所有人的类别。
此外,有三种类型的访问:
- 读(r):对于普通文件,这允许用户查看文件的内容。对于目录,它允许用户查看目录中文件的名称。
- 写(w):对于普通文件,这允许用户修改和删除文件。对于目录,它允许用户在目录中创建、重命名和删除文件。
- 执行(x):对于普通文件,这允许用户在对该文件具有读取权限的情况下执行该文件。对于目录,它允许用户访问目录中的文件信息,有效地允许他们更改到它(cd)或列出它的内容(ls)。
我们列出了 r/w/x 作为三种文件访问类型,但在实践中,当你执行 ls 时,会发现其他的文件访问类型:
- s 是应用于可执行文件的 setuid/setgid 权限。运行它的用户继承文件所有者或组的有效特权。
- t 是黏性位,仅与目录相关。如果设置了,那么它将阻止非 root 用户删除其中的文件,除非该用户拥有该目录/文件。
Linux 中还有一些特殊的设置可以通过 chattr(change 属性)命令来实现。
让我们来看看文件权限的作用(注意,为了更好的可读性,ls 命令输出中的空格已经被扩展了):

- ❶ 文件名称;
- ❷ 最后修改的时间戳;
- ❸ 文件大小(字节);
- ❹ 文件所属的组;
- ❺ 文件所有者;
- ❻ 硬链接数量;
- ❼ 文件模式。
当放大文件模式时,也就是说,文件类型和权限在前面的代码段中的 ❼,我们有以下含义的字段:

❶ 其他人的权限;
❷ 组的权限;
❸ 文件所有者的权限;
❹ 文件类型。
文件模式中的第一个字段表示文件类型,具体请参见下表:
象征 | 语义 |
---|---|
- | 一个常规文件(比如当你 touch abc 时) |
b | 块专用文件 |
c | 字符特殊文件 |
C | 高性能(连续数据)文件 |
d | 目录 |
l | 符号链接 |
p | 命名管道(用 mkfifo 创建)的套接字 |
s | 套接字 |
? | 其他(未知)文件类型 |
文件模式的其余部分编码了各种目标的权限集,从所有者到所有人,如下表所示:
模式 | 有效权限 | 十进制 |
---|---|---|
--- | 无 | 0 |
--x | 执行 | 1 |
-w- | 写 | 2 |
-wx | 写和执行 | 3 |
r-- | 读 | 4 |
r-x | 读和执行 | 5 |
rw- | 读和写 | 6 |
rwx | 读写执行 | 7 |
还有一些其他(旧的或过时的)字符,如 M 或 P,用于 0 的位置,你可以基本上忽略。如果你对它们的意思感兴趣,则运行 info ls -n"What information is listed"。
结合起来,文件模式中的这些权限定义了目标集的每个元素(用户、组、其他)所允许的内容,如表所示,通过访问检查和强制执行。
让我们来看几个例子:
- 755:为其所有者提供完全访问权限,为其他人读和执行;
- 700:所有者的完全访问权限,其他人无;
- 664:所有者和组的读写权限,其他人只读;
- 644:为所有者读写,其他人只读;
- 400:所有者只读。
664 在我的系统中有特殊的意义。当我创建一个文件时,这是它被分配的默认权限。你可以使用 umask 命令进行检查。
setuid 权限用于告诉系统以所有者的身份运行可执行文件,并具有所有者的权限。如果文件由 root 拥有,就会出现问题。
可以使用 chmod 修改文件的权限。你可以显式地指定所需的权限设置(例如 644),也可以使用快捷方式(例如,+x 使其可执行)。但实际情况如何呢?
让我们用 chmod 创建一个可执行文件:
$ ls -al /tmp/masktest -rw-r--r-- 1 mh9 dev 0 Aug 28 13:07 /tmp/masktest ① $ chmod +x /tmp/masktest ② $ ls -al /tmp/masktest -rwxr-xr-x 1 mh9 dev 0 Aug 28 13:07 /tmp/masktest ③
- ❶ 最初,文件权限对所有者是 r/w,对其他人是只读的,也就是 644;
- ❷ 使文件可执行;
- ❸ 现在文件权限为对所有者是 r/w/x,对其他人是 r/x,也就是 755。

图 3 使文件可执行以及文件权限如何随其变化
在上图中,你可以看到背后发生了什么。请注意,你可能不想赋予每个人执行该文件的权限,因此在这里使用 chmod 744 可能会更好,只给所有者正确的权限,而不更改其他权限。
你也可以使用 chown(和组的 chgrp)改变所有权:
$ touch myfile $ ls -al myfile -rw-rw-r-- 1 mh9 mh9 0 Sep 4 09:26 myfile ① $ sudo chown root myfile ② -rw-rw-r-- 1 root mh9 0 Sep 4 09:26 myfile
- ❶ myfile 文件,我创建并拥有它;
- ❷ chown 后,root 拥有该文件。