使用chmod递归管理目录和文件权限

你是否厌倦了手动更改文件和目录权限?是否正在寻找一种更快、更高效的方法来修改文件和目录权限?如果是的话,那么您来对地方了,因为在这篇文章中,您将学到如何递归地使用命令chmod更改文件和目录权限!

继续阅读以了解更多信息!

先决条件

要跟着操作,您需要一台运行Linux的设备和一个具有文件和子目录权限的目录,供您练习使用。

学习有关Linux用户和组

在Linux中,所有者和组对于安全地管理文件和目录至关重要。所有者是文件或目录的分配者,默认情况下是创建者。在Linux中,文件和目录也属于组。用户和组都是通过chown命令设置的。

在下面的截图中,绿色突出显示的内容显示了拥有文件或目录的用户,例如此示例中的mihail。蓝色突出显示的内容显示了文件或目录所属的组,例如此示例中由staff组拥有。

Listing the owner and group of a set of files and directories

了解Linux文件和目录权限

权限设置了用户或组在给定文件或目录上可以执行的操作。它们由字符表示,并分配了一个数值。

  • 读取(r4):指示用户或组是否可以读取文件或目录的内容。读取权限默认授予所有新创建的文件和目录的所有方。
  • 写入(w2):指示用户或组是否可以编辑对象的内容。此权限默认仅授予文件或目录所有者。
  • 执行(x1):指示用户或组是否可以执行文件或在目录内执行命令。执行权限默认仅授予目录,而不是文件。

如果您不给用户(u)执行目录的权限,他们将无法列出内容,因为用户将无法在目录中执行命令!

下面是一个示例,命令 ls -l 的输出展示了不同的权限类型。那些由值 d 预先的权限表示目录。

Listing file and directory permissions

那么为什么对于每个对象似乎有三组权限?通过将权限分为下面列出的各个部分(在本教程中称为方)实现了对权限的精细控制。

  • 用户(u): 文件或目录的所有者,以蓝色突出显示。
  • 群组(g): 文件或目录所属群组的成员,以绿色突出显示。
  • 其他(o): 所有未明确分配的额外用户和群组,以红色突出显示。
Demonstrating the combined permissions for a file or directory

通过 chmod 递归命令更改文件权限

具备适当的 Linux 权限理解后,继续阅读以了解如何更改文件权限。权限通过下面的示例中展示的 chmod 递归命令来修改。

1. 首先,使用 ls -l 命令检查当前权限。这里显示了 my_dir/index.js 文件。

Checking the current permission of index.js.

2. 运行 chmod 命令,指定权限方,a(全部),以及权限,rwx,即读取/写入/执行。完整命令如下: chmod a=rwx index.js

Changing index.js’ permissions.

3. 如您所见,运行 chmod 递归不会返回任何输出。要验证权限是否已更改,请再次运行命令 ls -l

Verifying index.js permissions

通过数字值设置文件权限

还记得与读取或写入等权限相关联的数字吗?您可以通过数字指定特定的权限,而不是指定字符值。通过添加这些值,您可以创建特定的权限,例如 6,它是写入(2)和读取(4)权限的组合。

在下面的示例中,通过命令chmod 664 main.pymain.py文件设置权限。数字值的分解如下。

  • 用户:读取和写入(6)。
  • 组:读取和写入(6)。
  • 其他:读取(4)。
Changing permissions for main.py.

权限更改后,使用命令ls -l验证main.py文件的新权限。

Verifying permissions for main.py

移除和添加文件权限

到目前为止,您运行的非数字命令使用了分配参数(=)与chmod递归,设置显式权限。您可以使用-删除(-)或添加(+)权限到现有权限集中。

1. 首先,通过命令ls -l README.md列出README.md文件的现有权限。

Checking README.md current permissions

2. 接下来,为README.md添加(+)用户组(u)执行(x)权限,同时从其他组(o)移除(-)读取(r)权限,使用以下命令chmod u+x,o-r README.md。不同组的权限用逗号(,)分隔。

Changing README.md permissions

3. 运行ls -l README.md命令验证权限是否已修改。

Checking README.md new permissions

递归更改文件和目录权限

尽管您正在取得进展,但您一次只能处理一个文件。如果您有大量文件需要更改权限,该怎么办?是时候提升自己的水平,学会为多个文件更改权限了。

更改多个文件的一个选项是使用带有-R(递归,小写)选项的chmod递归运行。递归选项将更改给定路径下所有文件(包括子目录中的文件)的权限。

1. 考虑以下命令:chmod -R a=r,u=rwx my_dir。大多数选项您之前已经见过。

此命令将更改目录my_dir及其子目录中所有文件的权限,通过递归选项(-R)。文件设置为对所有人可读(r),当前用户的权限(u)设置为完全权限(读取、写入、执行)。

在下面的截图中,您可以看到执行该命令后的权限结果,该命令没有输出结果。

Checking my_dir files new permissions

2. 假设您在同一目录my_dir上运行命令chmod -R a=rwx my_dir。再次更改my_dir及其子目录中所有文件的权限,以赋予所有人(a)完全权限(读取、写入、执行)。由于chmod递归不显示输出,这是该命令的结果。

Checking my_dir files new permissions to confirm every part now has every permission

3. 数字方法如何?如下所示,递归方法也适用于数字权限,chmod -R 770 my_dir。这里给予用户和组完全权限,但不给予其他方面权限。

Recursively changing permissions with the numeric method

4. 运行ls -l检查my_dir文件和子目录的权限是否使用了数字方法设置。

Checking the permissions set once again, this time with the numeric method

通过特殊权限定义文件和文件夹行为

特殊权限允许拥有几种与标准权限集不同的额外特权。有三种特殊权限。以下是这些特殊权限的工作方式以及如何将它们添加到文件或目录。

设置SUID(用户+ S)权限

通常表示为SUID,它是用户的特殊权限。SUID有一个单一功能:带有SUID的文件始终作为拥有该文件的用户执行,而不管谁正在执行该文件。

例如,考虑index.js。要授予额外的SUID权限,请运行chmod u+s index.js

现在,如果运行ls -l index.js,您会发现用户的权限中有一个s而不是一个x。

Checking index.js new permissions

设置SGID(组+ S)权限

通常表示为SGID,此特殊权限有两个功能:

  • 如果为文件设置了该权限,则允许将文件作为拥有该文件的执行,而不管谁正在执行该文件。
  • 如果为目录设置了权限,那么在该目录中创建的任何文件都将其组所有权设置为该目录的所有者。

index.php文件上练习。要向此文件添加SGID权限,请运行以下命令:chmod g+s index.php

现在,如果运行ls -l index.php,你会发现权限中有一个s

Checking index.php new permissions

进入一个目录:my_dir。你可以使用以下命令向此目录添加SGID权限:chmod g+s my_dir。在该目录中创建的任何文件现在都将其组所有权设置为目录所有者。你可以使用ls -ld my_dir检查目录的新权限(d参数限制输出仅为目录)。

Checking my_dir new permissions

更改粘滞位权限

最后一种特殊权限也称为“粘滞位”。该权限不影响单个文件。但在目录级别,它限制了文件的删除。只有文件的所有者可以删除该目录内的文件。

向旧的熟悉my_dir目录添加粘滞位。为此,请运行以下命令:chmod +t my_dir

请注意,要添加粘滞位,你不需要在+t之前指定其他组(o)。

当你检查my_dir的新权限时,你将看到其他权限中有一个大写的T,如下图所示。

Checking my_dir new and special permissions

结论

恭喜!您涵盖了许多关于chmod递归的主题。您现在已经准备好应对使用 almighty chmod 工具时出现的任何棘手权限问题。您甚至学会了如何利用递归(-R)选项的威力。

下次当您需要管理文件或目录权限时,您打算如何利用chmod的多功能性?

Source:
https://adamtheautomator.com/chmod-recursive/