文件权限和属性
文件系统 使用 权限 和 属性 来管理系统进程与文件和目录交互的级别。
查看权限
使用 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
是来自一系列字母的任何字母,每个字母表示正在授予权限的对象。 它们如下:
权限与 #查看权限 (r
、w
和 x
) 中讨论的相同。
现在看看使用此命令的一些示例。假设您变得非常在意 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
在下一个示例中,您想要授予组和其他用户读取和执行权限,因此您在 =
之后放置权限字母(r
和 x
),且不带空格。
您可以简化此操作,在同一命令中放置多个 who
字母,例如
$ chmod go=rx Documents
chmod
命令中 who
字母或权限字母的顺序无关紧要:您可以有 chmod go=rx file
或 chmod 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 字母,而不是放置 r
、w
或 x
。 例如
之前:-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 之间的任何数字。 第一个数字适用于所有者的权限,第二个数字适用于组的权限,第三个数字适用于所有其他人的权限。
在此数字表示法中,值 r
、w
和 x
具有其自己的数值
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 的用户来说,两种方法的速度没有任何真正的显着差异。
您还可以使用四位数字的数字方法来设置 setuid
、setgid
和 sticky
位。
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 实用程序用于控制文件创建模式掩码,该掩码确定新创建文件的文件权限位的初始值。
文件属性
除了控制 用户和组 读取、写入和执行权限的文件模式位之外,一些文件系统还支持文件属性,这些属性可以进一步自定义允许的文件操作。
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]。