文件权限和属性
文件系统使用权限和属性来规范系统进程可以与文件和目录进行交互的级别。
查看权限
使用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
是字母范围中的任何一个,每个字母表示被赋予权限的对象。它们如下所示
权限与#查看权限(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
删除可写权限。您会注意到,无论您使用哪种方法,您都会得到相同的 3 位数字。您是使用文本还是数字将取决于个人喜好和打字速度。当您想要将目录或文件恢复为默认权限时,例如所有者的读取和写入(和执行)权限,但拒绝其他所有人写入权限,使用 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]。