文件权限和属性

来自 ArchWiki
(重定向自 Chattr

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

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

查看权限

使用 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 用户三元组中找到的 setuid 位; 在三元组中找到的 setgid 位; 它在其他三元组中找不到; 它也意味着设置了 x
S s 相同,但未设置 x; 在常规文件上很少见,在目录上无用。
t 粘滞位; 它只能在其他三元组中找到; 它也意味着设置了 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:文件所属的用户组
  • o其他用户,即其他人。
  • a:以上所有; 使用此选项代替键入 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 命令调用中在 = 之后包含 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]

参见