跳转至内容

文件权限与属性

来自 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 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 users,即所有其他人。
  • aabove(以上所有);使用此选项代替键入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文件,以便您拥有读写权限,并且可能正在处理foobar的同事(在web组中)也可以读写它,但其他用户只能读取它。

之前:-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从一个类别(例如所有者)复制权限,并将相同的权限授予组,甚至所有人。为此,在=之后输入另一个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来移除写入权限。您会注意到,无论使用哪种方法,您都会得到相同的3位数字。是使用文本还是数字取决于个人偏好和打字速度。当您想将目录或文件恢复到默认权限时,例如所有者读写(和执行)权限,但拒绝其他人写入权限,使用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

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

扩展属性

参阅扩展属性

技巧与提示

保留根

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

参见