chmod 命令与文件权限系统
前言
在 Linux 中,文件权限、属性和所有者权限控制着整个系统进程和用户对文件的访问级别。这样可以确保只有授权的用户和进程才能访问特定的文件和目录。
权限系统
基本的 Linux 权限模型是通过将系统文件与所有者和组进行关联起来,并分别为三类不同的用户分配权限访问来工作,分别是:文件归属者、组以及其他用户(其他用户指的是除了文件归属者及组之外的所有用户,即 Everyone)。
文件所属者权限可以使用 chown 命令或者 chgrp 命令进行修改。 这里主要说明权限设置,即 chmod 命令,该命令的全称是 change file modes or Access Control Lists。
而文件又有三种权限,分别是 读 权限、写 权限和 执行 权限。
这个权限允许使用者(或者管理员)控制哪些用户可以读取文件、写入文件以及执行文件。
对于一个文件有哪些权限,我们可以通过 ls 命令进行查看,示例:
$ ls -l file_name
下面是使用该命令输出的示例结果:
-rw-r--r-- 12 linuxize users 12.0K Apr 28 10:10 file_name
|[-][-][-]- [------] [---]
| | | | | | |
| | | | | | +-----------> 7. Group
| | | | | +-------------------> 6. Owner
| | | | +--------------------------> 5. Alternate Access Method
| | | +----------------------------> 4. Others Permissions
| | +-------------------------------> 3. Group Permissions
| +----------------------------------> 2. Owner Permissions
+------------------------------------> 1. File Type
第一个字符表示的是文件类型(如示例中的是 -),文件类型主要有三种,分别是:文件(使用 - 字符表示)、文件夹(使用 d 字符表示)以及符号链接(使用 l 字符表示)。
之后的九个字符表示文件权限,三个为一组,一共三组(一般叫三元组):
- 第一组表示文件所属者权限(示例中为
rw-), - 第二组表示组权限(示例中为
r--), - 最后一组表示其他用户权限(示例中为
r--)。
在上面的文件权限示例中(rw-r--r--)主要含义是:文件归属者具有读写权限(rw),归属者所在的以及其他用户只有读(r)权限。
根据文件类型,文件权限相应的具有不同的含义。这三个权限三元组中的每一个都可以由以下字符构成,并根据它们是被设置为文件还是目录而产生不同的效果:
权限在文件上的作用
如果在文件上,相应的权限如下所示:
| 权限 | 字符 | 含义 |
|---|---|---|
| 读 | - | 表示用户无读权限,禁止用户读取文件中的内容 |
r | 表示用户具有读权限 | |
| 写 | - | 表示用户无写权限,禁止用户进行写或者修改操作。 |
w | 表示用户有写权限 | |
| 执行 | - | 表示用户没有执行文件权限 |
x | 表示用户可以执行文件 | |
s | 如果在用户权限或者组权限中有该字符,就表示设置了 x 标志(如果在用户权限中找到该字符,会设置一个相应的 setuid。同理,如果在组权限中找到该字符,相应的会设置一个 setgid) | |
S | 与 s 字符相同,但是没有设置 x 标识。这个标识很少用在文件上 | |
t | 这个字符主要是设置在其他用户权限中,会设置一个 sticky 标志位,该字符对文件没卵用 | |
T | 与 t 相同,但是没有设置 x 标志。这个标志对文件没用 |
权限在目录上的影响
如果在文件夹上,相应的权限如下所示:
| 权限 | 字符 | 含义 |
|---|---|---|
| 读 | - | 无法显示目录中的内容 |
r | 可以查看目录中的内容(比如使用 ls 命令查看文件夹下的内容) | |
| 写 | - | 无法修改目录(比如重命名) |
w | 允许对目录进行写操作(比如删除或者重命名目录) | |
| 执行 | - | 表示不能改变目录 |
x | 可以使用 cd 命令进入目录 | |
s | 如果在用户权限或者组权限中有该字符,就表示设置了 x 标志(如果在用户权限中找到该字符,会设置一个相应的 setuid ;同理,如果在组权限中找到该字符,相应的会设置一个 setgid )。 在目录上设置 setgid 标志时,在其中创建的新文件将继承目录ID( GID ),而不是此件改文件的用户所在组的ID。 | |
S | 与 s 字符相同,但是没有设置 x 标识。但是该字符对目录没卵用 | |
t | 这个字符主要是设置在其他用户权限中,会设置一个 sticky 标志位。当设置在目录上时,仅仅文件、目录所有者或者超级管理员才能删除或重命名文件。 | |
T | 与 t 相同,但是没有设置 x 标志。但是对目录没卵用 |
修改文件权限
我们可以使用 chmod 命令修改文件权限,不过想要修改文件权限必须使用 root 用户或者具有 sudo 权限的用户才能够修改。使用 chmod 命令一定要小心,特别是在递归更改权限时(使用 -R 参数表示递归修改) 。另外,该命令可以接受一个或多个以空格分隔的文件或目录最为参数。
修改权限时可以使用符号模式、数值模式或者引用文件三种模式进程设置权限。
基本的命令格式如下:
chmod [option] mode file ...
可选参数可使用 man chmod 命令进行查看,不过一般使用递归修改文件权限的场景比较多(-R 参数),即:
chmod -R mode file ...
使用符号模式修改文件权限(推荐)
使用符号模式修改文件权限的 chmod 命令的语法格式如下:
chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE...
第一组 [ugoa…] 表示的是用户标志,主要用户定义哪些用户,文件权限修改时其实就是作用于这些用户:
u:文件所属者用户g:指定的组o:其他用户(即Everyone)a:所有用户
注意: 在修改权限时如果省略了用户标志,则默认为 a (即所有用户)。
第二组 [-+=] 表示操作标志,定义权限是否要删除、添加或设置:
-:删除指定权限+:增加指定权限=:将当前权限更改为指定的权限(移除其他所有权限)。如果在=号之后没有设置授予权限,则删除指定用户的所有权限
第三组 perms 就是指定设置的权限。可以使用以下零个、一个或者多个字母来显示设置:
r w x X s t
注意: 当要为多个用户设置权限时,使用英文逗号(不要使用空格)分隔符模式进行区分。
下面是使用符号模式修改权限的一些示例:
- 给用户所在的组设置执行(
x)权限,不设置读写权限:
$ sudo chmod g=x file_name other_file
- 移除文件上所有用户的写权限:
$ sudo chmod a-w file_name other_file
- 强制删除其他用户的执行权限(利用递归
-R参数修改指定目录下的所有文件):
$ sudo chmod -R o-x dir_name other_dir
- 移除组、其他用户的读写和执行权限:
$ sudo chmod og-rwx file_name other_file
也可以使用下面的命令达到相同的效果:
$ sudo chmod og= file_name other_file
- 给用户设置读写和执行权限、组仅设置读权限、移除其他用户的所有权限:
$ sudo chmod u=rwx,g=r,o= file_name other_file
使用数值模式修改文件权限
使用数值模式修改文件权限的 chmod 命令的语法格式如下:
chmod [OPTIONS] NUMBER FILE...
当使用数字模式时,我们可以同时设置三个用户类的(所有者、组合其他用户)权限。
使用数字设置权限时,权限号码可以是3位或者4位。
当是3位数字时:第一位表示文件所有者权限,第二位表示文件所属组的权限,最后一位表示其他用户的权限。
读写执行对应的数字如下:
r (read)= 4w (write)= 2x (execute)= 1no permissions= 0
一个用户有哪些权限由该组的权限之和表示。
要在数值模式下找出文件的权限,只需要计算所有用户类的总数。例如,要想给文件所有者授予读写和执行权限、给组设置读和执行权限、给其他用户只设置读权限,只需要执行如下操作即可:
- Owner:
rwx= 4+2+1=7 - Group:
r-x= 4+0+1=5 - Others:
r-x= 4+0+0=4
使用上面的方法,我们就得到一个 754,这三位数值即表示我们所需要的权限,命令如下:
$ sudo chmod 754 file_name
如果想要利用 setuid 、 setgid 和 sticky 位标志进行设置权限,我们就需要使用四位数字进行表示:
setuid= 4setgid= 2sticky= 1no changes= 0
如果第一个数字是0,可以省略,并且模式可以用3个数字表示,即 0754 和 754 含义相同。
要计算数值模型,可以使用另一种方法(二进制方法)。但利用这种计算方式稍微复杂一些,对于大多数用户来说,知道如何使用 4、2、和 1 计算就足够了。
下面是使用数值模式修改权限的一些示例:
- 给所有者读写权限、但是仅仅给组合其他用户读权限:
$ chmod 644 file_name
- 给所有者读写和执行权限、给组读和执行权限但是不给其他用户任何权限:
$ chmod 750 file_name
- 给所有用户读写和执行权限并设置一个
sticky位:
$ chmod 1777 dir_name
- 使用递归模式修改目录权限:给所有者读写和执行权限、不给组和其他用户任何权限:
$ chmod -R 700 dir_name
结束语
在 Linux 中,使用文件权限、属性和所有权来限制用户对文件的访问。而文件的权限我们一般都是使用 chmod 命令进行修改,在修改权限时主要有两种:符号模式和数值模式。
个人更推荐使用符号模式,因为该模式修改权限时更加直观,想要给用户增加权限时只需要使用 u+ 即可。反过来,使用数值模式必须要最少写三位数值,还不够直观。
当然,实际使用中还是看个人喜好吧~
--