简介
Linux 是一个基于 Unix 概念的多用户操作系统,它通过文件所有权和权限来提供文件系统级别的安全性。要可靠地管理云服务器,必须对所有权和权限的工作原理有相当的了解。处理文件所有权和权限有许多复杂之处,但本教程将提供一个良好的入门介绍。
本教程将涵盖如何查看和理解 Linux 的所有权和权限。如果你正在寻找如何修改权限的教程,可以阅读《Linux 权限基础知识》和《如何在 VPS 上使用 Umask》。
先决条件
确保你理解本系列先前教程中涵盖的概念:
- Linux 终端简介
- 基本的 Linux 导航和文件管理
要遵循本教程,你需要访问一个云服务器。你可以按照本指南创建一个 DigitalOcean droplet。
关于用户
如简介中所述,Linux 是一个多用户系统。在了解所有权和权限之前,你应该理解 Linux 用户和组的基本原理,因为它们是所有权和权限适用的实体。让我们从用户是什么开始。
在 Linux 中,有两种类型的用户:系统用户和普通用户。传统上,系统用户用于在系统上运行非交互式或后台进程,而普通用户用于登录和交互式地运行进程。当你首次初始化并登录到 Linux 系统时,你可能会注意到它已经创建了许多系统用户来运行操作系统所依赖的服务。这是正常的。
你可以通过查看 /etc/passwd
文件的内容来查看系统上的所有用户。该文件中的每一行都包含有关单个用户的信息,以其用户名(第一个 :
之前的名称)开头。你可以使用 cat
命令打印 passwd
文件的内容:
cat /etc/passwd
… sshd:x:109:65534::/run/sshd:/usr/sbin/nologin landscape:x:110:115::/var/lib/landscape:/usr/sbin/nologin pollinate:x:111:1::/var/cache/pollinate:/bin/false systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false vault:x:997:997::/home/vault:/bin/bash stunnel4:x:112:119::/var/run/stunnel4:/usr/sbin/nologin sammy:x:1001:1002::/home/sammy:/bin/sh
超级用户
除了这两种用户类型外,还有超级用户,或称根用户,它有能力覆盖任何文件所有权和权限限制。实际上,这意味着超级用户有权访问服务器上的任何内容。这个用户用于进行系统范围的更改。
还可以配置其他用户帐户以具有“超级用户权限”。这通常被称为具有 sudo
,因为具有权限临时获得超级用户权限的用户在执行管理员级别命令之前要加上 sudo
。事实上,创建一个具有 sudo
权限用于系统管理任务的普通用户被认为是最佳实践。这样,你可以更加谨慎地使用根用户帐户。
关于组
组是零个或多个用户的集合。用户属于一个默认组,并且还可以是服务器上任何其他组的成员。
你可以通过查看 /etc/group
文件中的内容来查看系统上的所有组及其成员,就像查看用户的 /etc/passwd
一样。本文不涵盖组管理。
现在你知道了用户和组是什么,让我们来谈谈文件所有权和权限!
查看所有权和权限
在 Linux 中,每个文件都由一个单独的用户和一个单独的组拥有,并且有自己的访问权限。让我们看看如何查看文件的所有权和权限。
查看文件权限的最常见方法是使用带有长列表选项 -l
的 ls
命令,例如 ls -l myfile
。如果你想查看当前目录中所有文件的权限,请运行不带 myfile
参数的命令,如下所示:
ls -l
以下是 ls -l
输出的示例截图,带有每列输出的标签:
!ls -l
每个文件列出了其模式(包含权限)、所有者、组和名称。为了帮助解释所有这些字母和连字符的含义,让我们将模式列分解为其组成部分。
理解模式
为了帮助解释所有的分组和字母的含义,这里对上面示例中的第一个文件的模式元数据进行了详细分解:
!模式和权限分解
文件类型
在 Linux 中,有两种类型的文件:普通文件 和 特殊文件。文件类型由文件的模式的第一个字符表示 — 在本指南中,这将被称为“文件类型字段”。
普通文件可以通过它们的文件类型字段中的连字符(-
)来识别。普通文件可以包含数据或其他任何内容。它们被称为普通文件,以区别于特殊文件。
特殊文件可以通过它们的文件类型字段中的非连字符字符(如字母)来识别,并且操作系统会以与普通文件不同的方式处理它们。出现在文件类型字段中的字符表示特定文件的特殊类型。例如,目录是最常见的特殊文件,它的文件类型字段中出现的 d
字符表示目录(就像在上一个截图中一样)。还有其他几种特殊文件。
权限类别
从图表中可以看出,模式 列指示文件类型,后跟三个三位组,或者说是权限类别:用户(所有者)、组和其他。类别的顺序在所有 Linux 系统中都是一致的。
这三个权限类别的工作方式如下:
- 用户:文件的所有者属于这个类别。
- 组:文件的组成员属于这个类别。组权限是在给定文件上为多个用户分配权限的有用方式。
- 其他:不属于该文件的用户或组类别的任何用户属于这个类别。
阅读符号权限
接下来要注意的是那些三个字符组。它们以符号形式表示了每个类别对于给定文件的权限。
在每个三位组中,读取、写入和执行权限以以下方式表示:
- 读取:在第一个位置表示为
r
- 写入:在第二个位置表示为
w
- 执行:在第三个位置表示为
x
。在一些特殊情况下,这里可能会有不同的字符。
在这些字符的位置上出现连字符(-
)表示该类别没有相应的权限。例如,如果文件的组(第二个)三位组为 r--
,则该文件对于与文件关联的组是“只读”的。
理解读取、写入、执行
现在你知道如何读取文件的权限了,你应该知道每个权限实际上允许用户做什么。本教程将逐个覆盖每个权限,但请记住,它们通常与彼此结合使用,以允许对文件和目录进行有用的访问。
以下是每种权限类型授予用户的访问权限的详细说明:
读取
对于普通文件,读取权限允许用户查看文件的内容。
对于目录,读取权限允许用户查看目录中文件的名称。
写入
对于普通文件,写入权限允许用户修改和删除文件。
对于目录,写入权限允许用户删除目录,修改其内容(在其中创建、删除和重命名文件),以及修改用户具有写入权限的文件的内容。
执行
对于普通文件,执行权限允许用户执行(运行)文件 — 用户还必须具有读取权限。在用户能够运行可执行程序和 shell 脚本之前,必须设置执行权限。
对于目录,执行权限允许用户访问或遍历(即 cd
)目录,并访问目录中文件的元数据(在 ls -l
中列出的信息)。
模式(和权限)的示例
现在你知道如何读取文件的模式,并理解每个权限的含义,你将看到一些常见模式的示例,并对其进行简要说明,以将这些概念联系起来。
-rw-------
:只有所有者可以访问的文件-rwxr-xr-x
:系统上每个用户都可以执行的文件。一个“全局可执行”文件-rw-rw-rw-
:系统上每个用户都可以修改的文件。一个“全局可写”文件drwxr-xr-x
:系统上每个用户都可以读取和访问的目录drwxrwx---
:只有所有者和组可以修改(包括其内容)的目录drwxr-x---
:只有组可以访问的目录
与其他两个类别相比,文件的所有者通常拥有最多的权限。通常情况下,你会发现组和其他类别只有所有者权限的子集(相等或更少)。这是有道理的,因为文件应该只能被有特定原因需要它们的用户访问。
还要注意的是,尽管许多权限组合是可能的,但在大多数情况下只有某些权限组合是有意义的。例如,写入或执行访问几乎总是伴随着读取访问,因为很难修改,也不可能执行,你无法读取的东西。
结论
现在,您应该对 Linux 中的所有权和权限是如何工作有了很好的理解。要了解如何使用 chown
、chgrp
和 chmod
修改这些权限,请参考《Linux 权限基础知识》和《在 VPS 上如何使用 Umask》。
如果您想了解更多关于 Linux 基础知识的内容,请阅读本系列的下一个教程《Linux I/O 重定向简介》。