Linux 中的 chmod 命令用法

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

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

Linux 文件权限

在继续之前,让我们解释一下基本的 Linux 权限模型。

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

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

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

有三种文件权限类型适用于每类用户:

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

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

可以使用以下 ls 命令查看文件权限:

ls -l filename.txt
-rw-r--r-- 12 username group 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) 或任何其他特殊类型的文件。

接下来的 9 个字符代表文件许可权,每 3 个为一个三元组,分别对应一类用户的权限。第一个三元组显示所有者权限,第二个三元组显示组用户权限,最后一个三元组显示其他用户的权限。根据文件类型,权限可能具有不同的含义。

在上面的示例中, (rw-r--r--) 表示文件所有者具有读写权限 (rw-) ,组用户和其他用户仅具有读取权限 (r--) 。

这三个权限三元组中的每一个都可以由以下字符构成,并具有不同的效果:

文件的权限

允许 字符 存档意义
- 该文件不可读。您无法查看文件内容。
r 该文件是可读的。
- 该文件无法更改或修改。
w 可以更改或修改文件。
执行 - 该文件无法执行。
x 该文件可以执行。
s 如果在 user 三元组中找到,它将设置该 setuid 位。如果在 group 三元组中找到,它将设置该 setgid 位。这也意味着 x 已设置标志。在可执行文件上设置 setuidsetgid 标志时,将使用文件的所有者和/或组特权来执行文件。
S s 相同,但未设置 x 标志。此标志很少在文件上使用。
t 如果在 others 三元组中找到,它将设置该 sticky 位。这也意味着 x 已设置标志。该标志在文件上无用。
T t 相同,但未设置 x 标志。该标志在文件上无用。

目录(文件夹)的权限

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

允许 字符 目录意义
- 该目录的内容无法显示。
r 可以显示目录的内容。(例如,您可以使用列出目录内的文件 ls 。 )
- 目录的内容无法更改。
w 目录的内容可以更改。(例如,创建新文件删除文件  等 。 )
执行 - 目录不能进入浏览。
x 可以使用 cd 浏览目录。
s 如果在 user 三元组中找到,它将设置该 setuid 位。如果在 group 三元组中找到,它将设置该 setgid 位。这也意味着 x 已设置标志。在 setgid 目录上设置标志后,在其中创建的新文件将继承目录组 ID(GID) ,而不是创建文件的用户的主要组 ID 。 setuid 对目录没有影响。
S 与相同, s 但未设置 x 标志。此标志在目录上无用。
t 如果在 others 三元组中找到,它将设置该 sticky 位。这也意味着 x 已设置标志。在目录上设置粘滞位后,只有文件的所有者,目录的所有者或管理用户才能删除或重命名目录中的文件。
T 与相同, t 但未设置 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... :)可使用零个或一个或多个下列字母: rwxXs ,和 t 。将权限从一个用户类别复制到另一个用户类别时,请使用 u, go 中的单个字母 。

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

下面是一些如何 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
    
  • 在给定目录中添加一个粘性位:

    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
  • 组: rx = 4 + 0 + 1 = 5
  • 其他: rx = 4 + 0 + 0 = 4

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

要设置 setuidsetgidsticky bit 标志使用4个位数。

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

  • setuid = 4
  • setgid = 2
  • 粘性 = 1
  • 无变化 = 0

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

如果第一个数字为0,则可以省略,并且该模式可以用3个数字表示。数值模式 0755 与相同 755

要计算数字模式,您还可以使用另一种方法(二进制方法),但是稍微复杂一点。对于大多数用户,知道如何使用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 权限。

默认情况下,更改 symlink 的权限时, 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 手册页。