myfreax

Linux chmod 命令修改文件目录权限

在Linux,通过文件权限,属性和所有权来管理对文件的访问

Linux chmod 命令修改文件目录权限
Linux chmod 命令修改文件目录权限

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

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

Linux 文件权限

在继续之前,让我们解释一下基本的 Linux 权限模型。在 Linux ,每个文件都与一个所有者和一个组相关联,并为三类不同的用户分配访问权限:

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

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

每个文件都有的三种权限类型:

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

此概念允许您指定允许哪些用户读取文件、写入文件或者执行文件。你可以使用 ls 命令查看文件权限 :

ls -l filename.txt
-rw-r--r-- 12 myfreax users 12.0K Apr  8 20:51 filename.txt
|[-][-][-]-   [------] [---]
| |  |  | |      |       |
| |  |  | |      |       +-----------> 7. 组Group
| |  |  | |      +-------------------> 6. 所有者Owner
| |  |  | +--------------------------> 5. 访问方法 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(用户) 三元组中找到 s 表示文件已设置 setuid 位。如果在 group(Linux 组) 三元组中找到 s,则表示文件已设置 setgid 位。这也意味着可执行权限已设置。 当在可执行文件设置 setuid 或 setgid 标志时,文件将以文件的所有者或组权限执行。
S 和 s 一样,但可执行权限没有被设置,这个标志很少使用在文件上
t 如果在 others(其它人) 三元组中找到它设置 t ,也就是已设置 sticky 位。 这也意味着已设置文件的可执行权限。此标志对文件无用。
T 与 t 相同,但未设置可执行权限。此标志对文件无用。

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

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

权限 字符 含义
- 目录的内容不可见
r 目录内容可见。
例如你可以在目录内部使用 ls 命令列出文件的内容
- 无法修改目录内容
w 目录的内容可以更改。
例如 创建文件 或者删除文件 删除文件 等等
执行 - 不能使用 cd 命令切换目录
x 可以使用 cd 命令切换到目录
s 如果在 user 三元组中找到 s,则目录已设置 setuid 位。如果在 group 三元组中找到 s 则表示已设置 setgid 位。这也意味着可执行权限已设置。当在目录设置 setgid 标志时,在目录创建的文件将继承目录组 GID,而不是创建文件的用户主要组 ID。 setuid 对目录没有影响。
S 与 s 相同,但未设置可执行权限。 此标志在目录上没有用。
t 如果在其他人三元组中找到,它会设置粘性位。 这也意味着设置可执行权限。 当在目录设置粘性位时,只有文件所有者、目录所有者或管理用户可以删除或重命名目录中的文件。
T 与 t 相同,但未设置可执行权限。 此标志在目录上没用。

chmod 命令

chmod命令的语法形式 chmod [OPTIONS] MODE FILE...MODE 是权限的模式 ,FILE... 可以是一个或者多个文件与目录,[OPTIONS] chmod 命令的选项,是可选参数。

chmod 命令允许您使用符号或数字模式或参考文件修改改文件的权限。 我们将在本文后面更详细地解释这些模式。当使用 chmod 命令修改多个文件与目录时 请使用空格分隔多个文件与目录。

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

chmod [OPTIONS] MODE FILE...

符号模式

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

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

第一组参数 [ugoa…],即用户类型的参数,确定修改文件权限的用户类别,[] 中括号表示参数是可选的。

  • u- 文件所有者。
  • g- 组。
  • o- 其它人。
  • a- 所有用户,与同时指定 ugo 一样。

如果省略[ugoa…] 参数,则默认为所有用户并且由 umask 设置的权限不受影响。

第二组参数 [-+=],操作权限的参数,定义是否要删除、添加或设置权限,[] 中括号表示参数是可选的:

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

可以使用字母 r、w、x、X、s 和 t 中的零个,一个或多个来设置权限 perms... 参数。使用单个字母 u、g 和 o 为指定类别的用户设置权限。

当为多个种用户类型设置权限时,请使用逗号分隔多个符号模式。下面的一些示例展示如何在符号模式下使用 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 位数字时,第一位数字的含义如下:

  • 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

例如,以下 chmod 命令将权限分配 file1file2

chmod --reference=file1 file2

递归修改文件权限

要对指定目录下所有文件和目录进行递归操作,请使用chmod 命令的 -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 d -exec chmod u=rwx,go=rx {} \;

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

结论

chmod 命令用于修改文件的权限。可以使用符号或数字模式设置权限。要了解更多信息,请访问 chmod 手册页。如果您有任何问题或反馈,请随时发表评论。

内容导航