在 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. 访问方法 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
(读)= 4w
(写)= 2x
(执行)= 1- 无权限 = 0
要以数字模式设置文件的权限,只需计算指定用户类别的总数即可。例如,要授予文件所有者读取、写入和执行权限,授予组的读取和执行权限,而只授予其他用户读取权限,您可以执行以下操作:
- 所有者:rwx=4+2+1=7
- 组:rx=4+0+1=5
- 其他人:rx=4+0+0=4
使用上面的方法,我们得出数值是 754
,它代表要设置的权限。
要设置 setuid
、setgid
和 sticky bit
粘性位,请使用四位数字。当使用 4 位数字时,第一位数字的含义如下:
- setuid =4
- setgid =2
- sticky =1
- 没有变化 = 0
接下来的三个数字与使用 3 位数字时的含义相同。如果首位是 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
例如,以下 chmod 命令将权限分配 file1
给 file2
。
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
手册页。如果您有任何问题或反馈,请随时发表评论。
支付宝打赏