文件权限和属性

出自 ArchWiki
(重定向自 Setfattr)

文件系统 使用 权限属性 来规范系统进程可以与文件和目录进行交互的级别。

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

查看权限

使用 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 操作系统中的一个命令,允许change 文件或目录的权限(或访问mode)。

文本方法

要更改文件的权限——或访问模式——请在终端中使用 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
注意:chmod 命令中,who 字母或权限字母的顺序无关紧要:您可以 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 命令调用中的 = 之后包含 rw。 如果您遗漏了 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 从一个类(例如所有者)复制权限,并将相同的权限授予组甚至所有人。为此,不要在 = 之后放置 rwx,而是放置另一个 who 字母。 例如

之前:-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]

参见