文件权限与属性
文件系统使用权限和属性来规范系统进程与文件和目录的交互级别。
查看权限
使用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文件,以便您拥有读写权限,并且可能正在处理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命令调用中的=之后包含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
要删除文件上的属性,只需将+更改为-。
扩展属性
参阅扩展属性。
技巧与提示
保留根
使用--preserve-root标志可阻止chmod递归操作/。例如,这可以防止用户删除系统范围内的可执行位,从而破坏系统。要每次都使用此标志,请将其设置在别名中。另请参阅[1]。