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

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

Linux文件权限

在进一步介绍之前,让我们解释一下基本的Linux权限模型。

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

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

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

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

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

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

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

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

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

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

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

权限对文件的影响

允许	字符	存档意义

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

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

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

允许	字符	存档意义

读	-	该目录的内容无法显示。
	 r	可以显示目录的内容。
(例如,您可以使用列出目录内的文件ls。)
写	-	目录的内容无法更改。
	 w	目录的内容可以更改。
(例如,您不能创建新文件,删除文件 ..etc。)
执行	-	目录不能更改为。
	 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...):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

向指定目录添加粘性位:

chmod o+t dirname

数值方法

使用数字方法时,chmod命令的语法具有以下格式:

chmod [OPTIONS] NUMBER FILE...

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

NUMBER可以是3或4位数字。

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

每个写入,读取和执行许可都具有以下数字值:

  • r(阅读)= 4
  • w(阅读)= 2
  • x(阅读)= 1 1
  • 无权限= 0

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

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

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

可能是,您将收到“无法访问'symlink':拒绝权限”错误,而不是更改目标所有权。

之所以发生该错误,是因为默认情况下,大多数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手册页面。

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

如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持