文件权限和属性

出自 ArchWiki
(重定向自 Permissions)

文件系统 使用 权限属性 来管理系统进程与文件和目录交互的级别。

警告: 当用于安全目的时,权限和属性仅防御来自已启动系统的攻击。为了保护存储的数据免受具有物理机器访问权限的攻击者的攻击,还必须实施静态数据加密

查看权限

使用 ls 命令的 -l 选项来查看为目录内容设置的权限(或 文件模式),例如

$ ls -l /path/to/directory
total 128
drwxr-xr-x 2 archie archie  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 archie archie  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 archie archie  4096 Jul  5 13:45 Downloads
-rw-rw-r-- 1 archie archie  5120 Jun 27 08:28 customers.ods
-rw-r--r-- 1 archie archie  3339 Jun 27 08:28 todo
-rwxr-xr-x 1 archie archie  2048 Jul  6 12:56 myscript.sh

第一列是我们必须关注的。以 drwxrwxrwx+ 的示例值为例,下表解释了每个字符的含义

d rwx rwx rwx +
文件类型,技术上不是其权限的一部分。有关可能值的说明,请参阅 info ls -n "What information is listed" 所有者对文件拥有的权限,如下所述。 组对文件拥有的权限,如下所述。 所有其他用户对文件拥有的权限,如下所述。 一个字符,指定备用访问方法是否应用于文件。当此字符为空格时,没有备用访问方法。. 字符表示具有安全上下文的文件,但没有其他备用访问方法。具有任何其他备用访问方法组合的文件用 + 字符标记,例如在访问控制列表的情况下。

三个权限三元组(上面示例中的 rwx)中的每一个都可以由以下字符组成

字符 对文件的影响 对目录的影响
读取权限(第一个字符) - 文件无法读取。 无法显示目录的内容。
r 文件可以读取。 可以显示目录的内容。
写入权限(第二个字符) - 文件无法修改。 无法修改目录的内容。
w 文件可以修改。 可以修改目录的内容(创建新文件或目录;重命名或删除现有文件或目录);需要同时设置执行权限,否则此权限无效。
执行权限(第三个字符) - 文件无法执行。 无法使用 cd 访问目录。
x 文件可以执行。 可以使用 cd 访问目录;实际上,这是唯一可以被认为是“从祖先目录继承”的权限位,事实上,如果路径中的任何目录未设置 x 位,则最终文件或目录也无法访问,无论其权限如何;有关更多信息,请参阅path_resolution(7)
s user 三元组中找到的 setuid 位;在group 三元组中找到的 setgid 位;在 others 三元组中找不到;它也意味着 x 已设置。
S s 相同,但 x 未设置;在常规文件中很少见,在目录中无用。
t 粘滞位;只能在 others 三元组中找到;它也意味着 x 已设置。
T t 相同,但 x 未设置;在常规文件中很少见。

有关更多详细信息,请参阅 info Coreutils -n "Mode Structure"chmod(1)

提示: 您可以使用 namei -l path 查看路径上的权限。

示例

让我们看一些示例来澄清

drwx------ 6 archie archie  4096 Jul  5 17:37 Documents

Archie 对 Documents 目录具有完全访问权限。他们可以列出、创建文件以及重命名、删除 Documents 中的任何文件,而无需考虑文件权限。他们访问文件的能力取决于文件的权限。

dr-x------ 6 archie archie  4096 Jul  5 17:37 Documents

Archie 具有完全访问权限,但他们无法创建、重命名、删除任何文件。他们可以列出文件,并且(如果文件权限允许)可以访问 Documents 中的现有文件。

d-wx------ 6 archie archie  4096 Jul  5 17:37 Documents

Archie 无法在 Documents 目录中执行 ls,但如果他们知道现有文件的名称,则他们可以列出、重命名、删除或(如果文件权限允许)访问它。此外,他们能够创建新文件。

d--x------ 6 archie archie  4096 Jul  5 17:37 Documents

Archie 只能(如果文件权限允许)访问他们知道的 Documents 目录中的那些文件。他们无法列出现有文件,也无法创建、重命名、删除任何文件。

您应该记住,我们详细说明了目录权限,这与单个文件权限无关。当您创建一个新文件时,更改的是目录。这就是为什么您需要对目录具有写入权限的原因。

让我们看另一个示例,这次是一个文件,而不是目录

-rw-r--r-- 1 archie web  5120 Jun 27 08:28 foobar

在这里我们可以看到第一个字母不是 d 而是 -。所以我们知道它是一个文件,而不是目录。接下来,所有者的权限是 rw-,因此所有者具有读取和写入的能力,但没有执行能力。所有者没有所有三个权限可能看起来很奇怪,但是 x 权限是不需要的,因为它是一个文本/数据文件,要由文本编辑器(如 Gedit、EMACS)或 R 等软件读取,而不是它本身的可执行文件(如果它包含类似 python 编程代码的内容,那么它很可能就是可执行文件)。组的权限设置为 r--,因此组有权读取文件,但不能以任何方式写入/编辑它——这基本上就像将某些内容设置为只读。我们可以看到,相同的权限也适用于其他所有人。

更改权限

chmod 是 Linux 和其他类 Unix 操作系统中的一个命令,允许更改文件或目录的权限(或访问模式)。

文本方法

要更改文件或目录的权限——或访问模式——,请在终端中使用 chmod 命令。以下是命令的一般结构

chmod who=permissions filename

其中 who 是字母范围中的任何一个,每个字母表示被赋予权限的对象。它们如下所示

  • u:拥有文件的用户
  • g:文件所属的用户组
  • oother 用户,即其他所有人。
  • a:以上all 所有;使用此选项代替键入 ugo

权限与#查看权限rwx)中讨论的相同。

现在看看一些使用此命令的示例。假设您变得非常重视 Documents 目录,并且想要拒绝除您自己以外的所有人读取、写入和执行(或在本例中搜索/查看)它的权限

之前:drwxr-xr-x 6 archie web 4096 Jul 5 17:37 Documents

$ chmod g= Documents
$ chmod o= Documents

之后:drwx------ 6 archie web 4096 Jul 6 17:32 Documents

在这里,因为您想要拒绝权限,所以在 = 之后不放置任何字母,权限将在其中输入。现在您可以看到只有所有者的权限是 rwx,而所有其他权限都是 -

这可以使用以下命令恢复

之前:drwx------ 6 archie web 4096 Jul 6 17:32 Documents

$ chmod g=rx Documents
$ chmod o=rx Documents

之后:drwxr-xr-x 6 archie web 4096 Jul 6 17:32 Documents

在下一个示例中,您想要向组和其他用户授予读取和执行权限,因此您将权限字母(rx)放在 = 之后,不带空格。

您可以简化此操作,以便在同一命令中放置多个 who 字母,例如

$ chmod go=rx Documents
注意: 您将 who 字母或权限字母放在 chmod 命令中的顺序无关紧要:您可以有 chmod go=rx filechmod og=xr file。它们都是一样的。

现在让我们考虑第二个示例,假设您想要更改 foobar 文件,以便您拥有读取和写入权限,并且组 web 中的同事(他们可能是处理 foobar 的同事)也可以读取和写入它,但其他用户只能读取它

之前:-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar

$ chmod g=rw foobar

之后:-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar

这与第一个示例完全相同,但使用文件而不是目录,并且您授予写入权限(只是为了给出一个授予每个权限的示例)。

文本方法快捷方式

chmod 命令允许使用 +- 而不是 = 从现有集合中添加和删除权限。这与上述命令不同,上述命令本质上是重写权限(例如,要将权限从 r-- 更改为 rw-,您仍然需要在 chmod 命令调用中的 = 之后包含 r 以及 w。如果您遗漏了 r,它将删除 r 权限,因为它们正在使用 = 重写。使用 +- 可以通过添加或删除当前权限集来避免这种情况)。

让我们使用 +- 方法尝试之前的示例,向组添加写入权限

之前:-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar

$ chmod g+w foobar

之后:-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar

另一个示例,拒绝所有 (a) 用户的写入权限

之前:-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar

$ chmod a-w foobar

之后:-r--r--r-- 1 archie web 5120 Jun 27 08:28 foobar

另一个快捷方式是特殊的 X 模式:这不是实际的文件模式,但它通常与 -R 选项结合使用,仅为目录设置可执行位,并保持常规文件不变,例如

$ chmod -R a+rX ./data/

复制权限

可以告诉 chmod 从一个类(例如所有者)复制权限,并将相同的权限授予组甚至所有人。为此,请在 = 之后放置另一个 who 字母,而不是放置 rwx。例如

之前:-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar

$ chmod g=u foobar

之后:-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar

此命令本质上转换为“将组 (g=) 的权限更改为与拥有用户 (=u) 相同”。请注意,您不能复制一组权限并同时授予新权限,例如

$ chmod g=wu foobar

在这种情况下,chmod 将抛出错误。

数字方法

chmod 也可以使用数字设置权限。

使用数字是另一种方法,允许您同时编辑所有者、组和其他所有人的权限,以及 setuid、setgid 和粘滞位。代码的基本结构如下

$ chmod xxx filename

其中 xxx 是一个 3 位数字,其中每个数字可以是 0 到 7 之间的任何数字。第一个数字适用于所有者的权限,第二个数字适用于组的权限,第三个数字适用于所有其他人的权限。

在此数字表示法中,值 rwx 具有自己的数值

r=4
w=2
x=1

要得出 3 位数字,您需要考虑您希望所有者、组和其他所有人拥有的权限,然后将它们的值加起来。例如,如果您想要授予目录的所有者读取、写入和执行权限,并且您希望组和所有人仅具有读取和执行权限,则您将得出如下数字值

  • 所有者:rwx=4+2+1=7
  • 组:r-x=4+0+1=5
  • 其他:r-x=4+0+1=5
$ chmod 755 filename

这等效于使用以下命令

$ chmod u=rwx filename
$ chmod go=rx filename

要以数字形式查看文件或目录的现有权限,请使用 stat(1) 命令

$ stat -c %a filename

其中 %a 选项指定以数字形式输出。

大多数目录设置为 755,以允许所有者读取、写入和执行,但拒绝其他所有人写入,而文件通常为 644,以允许所有者读取和写入,但仅允许其他所有人读取;请参阅关于非可执行文件缺少 x 权限的最后说明:这里也是一样的。

为了通过示例了解这一点,请考虑先前已使用的示例,但这次应用了数字方法

之前:-rw-r--r-- 1 archie web 5120 Jun 27 08:28 foobar

$ chmod 664 foobar

之后:-rw-rw-r-- 1 archie web 5120 Jun 27 08:28 foobar

如果这是一个可执行文件,如果您想授予所有者和组可执行权限,则该数字将为 774。或者,如果您希望每个人都只具有读取权限,则该数字将为 444。将 r 视为 4,w 视为 2,x 视为 1 可能是计算使用 chmod xxx filename 的数值的最简单方法,但还有一种二进制方法,其中每个权限都有一个二进制数,然后将其转换为数字。它有点复杂,但为了完整起见,此处包含在内。

考虑此权限集

-rwxr-xr--

如果您在每个授予的权限下放置 1,并在每个未授予的权限下放置 0,则结果将类似于这样

-rwxrwxr-x
 111111101

然后您可以转换这些二进制数

000=0	    100=4
001=1	    101=5
010=2	    110=6
011=3	    111=7

因此,上述值将为 775。

假设我们要从组中删除可写权限

-rwxr-xr-x
 111101101

该值将因此为 755,您将使用 chmod 755 filename 删除可写权限。您会注意到,无论您使用哪种方法,您都会得到相同的三位数。您是使用文本还是数字将取决于个人喜好和打字速度。当您想要将目录或文件恢复为默认权限时,例如,向所有者授予读取和写入(和执行)权限,但拒绝其他所有人写入权限,使用 chmod 755/644 filename 可能会更快。但是,如果您要将权限更改为非规范的内容,则使用文本方法可能更简单快捷,而不是尝试将其转换为数字,这可能会导致错误。可以认为,对于只需要偶尔使用 chmod 的用户来说,两种方法的速度没有真正的显着差异。

您还可以使用数字方法通过使用四位数字来设置 setuidsetgidsticky 位。

setuid=4
setgid=2
sticky=1

例如,chmod 2777 filename 将为每个人设置读/写/可执行位,并启用 setgid 位。

批量 chmod

通常,目录和文件不应具有相同的权限。如果需要批量修改目录树,请使用 find 有选择地修改其中一个或另一个。

仅将目录 chmod 为 755

$ find directory -type d -exec chmod 755 {} +

仅将文件 chmod 为 644

$ find directory -type f -exec chmod 644 {} +

更改所有权

chown 更改文件或目录的所有者,在某些情况下,这比更改权限更快更轻松。

考虑以下示例,使用 GParted 为备份数据创建新分区。Gparted 以 root 身份完成所有这些操作,因此默认情况下一切都属于 root。这一切都很好,但是当涉及到将数据写入已挂载的分区时,常规用户将被拒绝权限。

brw-rw---- 1 root disk 8,    9 Jul  6 16:02 sda9
drwxr-xr-x 5 root root    4096 Jul  6 16:01 Backup

如您所见,/dev 中的设备由 root 拥有,挂载位置 (/media/Backup) 也是如此。要更改挂载位置的所有者,可以执行以下操作

之前:drwxr-xr-x 5 root root 4096 Jul 6 16:01 Backup

# chown archie /media/Backup

之后:drwxr-xr-x 5 archie root 4096 Jul 6 16:01 Backup

现在,新的所有者 archie 可以将数据写入分区,而无需更改权限(因为所有者三元组已经具有 rwx 权限)。

注意
  • chown 始终清除 setuid 和 setgid 位。
  • 非 root 用户不能使用 chown 将他们拥有的文件“赠送”给另一个用户。

访问控制列表

访问控制列表 为文件系统提供了额外的、更灵活的权限机制,允许为任何用户或组设置对任何文件的权限。

Umask

umask 实用程序用于控制文件创建模式掩码,该掩码确定新创建文件的文件权限位的初始值。

文件属性

除了控制用户和组读取、写入和执行权限的文件模式位之外,一些文件系统还支持文件属性,这些属性可以进一步自定义允许的文件操作。

警告: 默认情况下,cprsync 和其他类似程序不会保留文件属性。

e2fsprogs 软件包包含程序 lsattr(1)chattr(1),它们分别列出和更改文件的属性。

以下是一些有用的属性。并非所有文件系统都支持每个属性。

  • a - 仅追加:文件只能以追加方式打开。
  • c - 已压缩:为文件启用文件系统级压缩。
  • i - 不可变:无法修改、删除、重命名、链接到。只能由 root 用户设置。
  • j - 数据日志:将日志用于文件数据写入以及元数据。
  • m - 无压缩:为文件禁用文件系统级压缩。
  • A - 无 atime 更新:文件的 atime 将不会被修改。
  • C - 无写时复制:禁用写时复制,适用于支持它的文件系统。

有关属性的完整列表以及每个属性的作用的更多信息,请参阅 chattr(1)

例如,如果您想在某个文件上设置不可变位,请使用以下命令

# chattr +i /path/to/file

要删除文件上的属性,只需将 + 更改为 -

扩展属性

请参阅扩展属性

技巧和窍门

保留 root 权限

使用 --preserve-root 标志来防止 chmod/ 上递归操作。例如,这可以防止某人系统范围内删除可执行位,从而破坏系统。要每次都使用此标志,请在 别名 中设置它。另请参见 [1]

参见