Linux 中的 Chmod 命令(文件权限)

评论 0 浏览 0 2019-09-17

在 Linux 中,对文件的访问是通过文件权限、属性和所有权来管理的。这确保只有授权的用户和进程才能访问文件和目录。

本教程介绍如何使用chmod命令更改文件和目录的访问权限。

Linux 文件权限

在进一步讨论之前,我们先解释一下基本的 Linux 权限模型。

在 Linux 中,每个文件都与一个所有者和一个组相关联,并为三个不同类别的用户分配了权限访问权限:

  • 文件所有者。
  • 组成员。
  • 其他人(其他所有人)。

可以使用 chownchgrp 命令更改文件所有权。

存在适用于每个类的三种文件权限类型:

  • 读取权限。
  • 写权限。
  • 执行权限。

此概念允许您指定允许哪些用户读取文件、写入文件或执行文件。

可以使用 ls 命令:

ls -l filename.txt

输出

-rw-r--r-- 12 linuxize users 12.0K Apr  8 20:51 filename.txt
|[-][-][-]-   [------] [---]
| |  |  | |      |       |
| |  |  | |      |       +-----------> 7. Group
| |  |  | |      +-------------------> 6. Owner
| |  |  | +--------------------------> 5. Alternate Access Method
| |  |  +----------------------------> 4. Others Permissions
| |  +-------------------------------> 3. Group Permissions
| +----------------------------------> 2. Owner Permissions
+------------------------------------> 1. File Type

第一个字符显示文件类型。它可以是常规文件 (-)、目录 (d)、符号链接 (l),或任何其他特殊类型的文件。

接下来的九个字符代表文件权限,三个三元组,每个三元组。第一个三元组显示所有者权限,第二个三元组显示组权限,最后一个三元组显示其他人权限。根据文件类型的不同,权限可能具有不同的含义。

上例中(rw-r--r--)表示文件所有者有读写权限(rw-),组和其他人只有读权限(r--)。

三个权限三元组中的每一个都可以由以下字符构成,并具有不同的效果,具体取决于它们是设置为文件还是目录:

权限对文件的影响

权限字符文件含义
-该文件不可读。您无法查看文件内容。
r该文件是可读的。
-该文件无法更改或修改。
w该文件可以更改或修改。
执行-该文件无法执行。
x该文件可以被执行。
s如果在user 三元组中找到,则设置setuid 位。如果在group 三元组中找到,则设置setgid 位。这也意味着设置了x标志。
当在可执行文件上设置了setuidsetgid标志时,该文件将以文件的所有者和/或组权限执行。
Ss相同,但未设置x标志。该标志很少在文件上使用。
t如果在others三元组中找到,则设置sticky位。
这也意味着设置了x标志。该标志对文件没有用。
Tt相同,但未设置x标志。该标志对文件没有用。

权限对目录(文件夹)的影响

在 Linux 中,目录是包含其他文件和目录的特殊类型的文件。

允许特点目录的含义
-无法显示该目录的内容。
r可以显示目录的内容。
(例如,您可以使用 ls .)
-该目录的内容无法更改。
w目录的内容可以更改。
(例如,您可以创建新文件 , 删除文件 ..ETC。)
执行-该目录无法更改。
x可以使用 cd 导航该目录 。
s如果在user三元组中找到,则设置setuid位。如果在group 三元组中找到,则设置setgid 位。这也意味着 x 标志已设置。当在目录上设置 setgid 标志时,在该目录中创建的新文件将继承目录组 ID (GID),而不是创建该文件的用户的主组 ID。
setuid 无效在目录上。
Ss相同,但未设置x标志。该标志对目录没有用。
t如果在others三元组中找到,则设置sticky位。
这也意味着设置了x标志。当在目录上设置粘滞位时,只有文件的所有者、目录的所有者或管理用户可以删除或重命名目录中的文件。
Tt相同,但未设置x标志。该标志对目录没有用。

使用chmod

chmod 命令采用以下一般形式:

chmod [OPTIONS] MODE FILE...

chmod 命令允许您使用符号或数字模式或引用文件更改文件的权限。我们将在本文后面更详细地解释这些模式。该命令可以接受一个或多个文件和/或目录作为参数,参数之间用空格隔开。

只有 root、文件所有者或具有 sudo 权限的用户才能更改文件的权限。使用 chmod 时要格外小心,尤其是在递归更改权限时。

符号(文本)方法

使用符号模式时chmod命令的语法格式如下:

chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE...

第一组标志 ([ugoa…]),即用户标志,定义文件权限被更改的用户类别。

  • u - 文件所有者。
  • g - 作为组员的用户。
  • o - 所有其他用户。
  • a - 所有用户,与ugo相同。

如果省略用户标志,则默认为a,权限由 umask 不受影响。

第二组标志 ([-+=]),即操作标志,定义是否要删除、添加或设置权限:

  • - 删除指定的权限。
  • + 添加指定的权限。
  • = 将当前权限更改为指定权限。如果=符号后未指定任何权限,则删除指定用户类的所有权限。

可以使用以下字母中的零个或一个或多个来显式设置权限 (perms...):rwxXst。将权限从一个用户类复制到另一个用户类时,请使用 ugo 组中的单个字母。

当为多个用户类别([,…])设置权限时,请使用逗号(不含空格)分隔符号模式。

以下是如何在符号模式下使用 chmod 命令的一些示例:

  • 授予组成员读取文件的权限,但不允许写入和执行该文件:

    chmod g=r filename
  • 删除所有用户的执行权限:

    chmod a-x filename
  • 递归删除其他用户的写权限:

    chmod -R o-w dirname
  • 删除除文件所有者之外的所有用户的读、写和执行权限:

    chmod og-rwx filename

    使用以下形式也可以完成同样的事情:

    chmod og= filename
  • 向文件所有者授予读取、写入和执行权限,向文件所在组授予读取权限,向所有其他用户授予无权限:

    chmod u=rwx,g=r,o= filename
  • 将文件的所有者权限添加到文件组成员拥有的权限中:

    chmod g+u filename
  • 为指定目录添加sticky位:

    chmod o+t dirname

数值法

使用数字方法时chmod命令的语法格式如下:

chmod [OPTIONS] NUMBER FILE...

使用数字模式时,您可以同时设置所有三个用户类别(所有者、组和所有其他)的权限。

NUMBER 可以是 3 位或 4 位数字。

当使用3位数字时,第一个数字代表文件所有者的权限,第二个数字代表文件所属的组,最后一个数字代表所有其他用户。

每个写入、读取和执行权限都具有以下数值:

  • r(读)= 4
  • w(写入)= 2
  • x(执行)= 1
  • 无权限 = 0

特定用户类别的权限数由该组的权限值的总和表示。

要找出数字模式下文件的权限,只需计算所有用户类别的总数即可。例如,要向文件所有者授予读、写和执行权限,向文件组授予读和执行权限,向所有其他用户授予只读权限,您将执行以下操作:

  • 所有者:rwx=4+2+1=7
  • 组:r-x=4+0+1=5
  • 其他:r-x=4+0+0=4

使用上面的方法我们得到数字754,它代表所需的权限。

要设置setuidsetgidsticky bit 标志,请使用四位数字。

当使用 4 位数字时,第一位数字的含义如下:

  • setuid=4
  • setgid=2
  • sticky=1
  • 没有变化= 0

接下来的三位数字与使用 3 位数字时的含义相同。

如果第一位为0则可以省略,模式可以用3位数字表示。数字模式0755755相同。

要计算数值模式还可以使用另一种方法(二进制方法),但它稍微复杂一些。对于大多数用户来说,了解如何使用 4、2 和 1 计算数字模式就足够了。

您可以使用 stat 命令以数字表示法检查文件的权限:

stat -c "%a" filename

输出

644

以下是如何在数字模式下使用 chmod 命令的一些示例:

  • 为文件所有者授予读写权限,并为组成员和所有其他用户授予只读权限:

    chmod 644 dirname
  • 授予文件所有者读取、写入和执行权限,授予组成员读取和执行权限,授予所有其他用户无权限:

    chmod 750 dirname
  • 授予给定目录的读、写和执行权限以及粘滞位:

    chmod 1777 dirname
  • 递归地为文件所有者设置读、写和执行权限,而对给定目录的所有其他用户没有权限:

    chmod -R 700 dirname

使用参考文件

--reference=ref_file选项允许您将文件的权限设置为与指定参考文件(ref_file)相同。

chmod --reference=REF_FILE FILE

例如,以下命令将file1的权限分配给file2

chmod --reference=file1 file2

递归更改文件的权限

要递归操作给定目录下的所有文件和目录,请使用-R (--recursive) 选项:

chmod -R MODE DIRECTORY

例如,要将/var/www目录下的所有文件和子目录的权限更改为755,您可以使用:

chmod -R 755 /var/www

符号链接 始终拥有777权限。

默认情况下,当更改符号链接的权限时,chmod 将更改链接指向的文件的权限。

chmod 755 symlink

你可能不会更改目标的所有权,而是会收到“cannot access ‘symlink’: Permission denied”的错误信息。

发生该错误的原因是,默认情况下,大多数 Linux 发行版上的符号链接都受到保护,并且您无法对目标文件进行操作。该选项在/proc/sys/fs/protected_symlinks中指定。 1 表示启用,0 表示禁用。建议不要禁用符号链接保护。

批量更改文件权限

有时,在某些情况下您需要批量更改文件和目录权限。

最常见的场景是递归地将网站文件的权限更改为644,将目录的权限更改为755

使用数值方法:

$ find /var/www/my_website -type d -exec chmod 755 {} \;
$ find /var/www/my_website -type f -exec chmod 644 {} \;

使用符号方法:

$ find /var/www/my_website -type d -exec chmod u=rwx,go=rx {} \;
$ find /var/www/my_website -type f -exec chmod u=rw,go=r {} \;

find 命令将搜索/var/www/my_website下的文件和目录,并将每个找到的文件和目录传递给chmod命令以设置权限。

结论

chmod命令更改文件的权限。可以使用符号或数字模式设置权限。

要了解有关 chmod 的更多信息,请访问 chmod man 页。

如果您有任何问题或反馈,请随时发表评论。

最后更新2023-10-04
0 个评论
标签