Linux中的Chmod命令(文件权限)

时间:2020-03-05 15:26:12  来源:igfitidea点击:

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

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

Linux文件权限

在继续之前,让我们解释一下基本的Linux权限模型。

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

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

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

有三种文件许可权类型适用于每个类:

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

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

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

ls -l filename.txt
-rw-r--r-- 12 theitroad 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'如果在“用户”三联体中找到,它会设置“Setuid”位。如果在“组”三联体中找到,它会设置“SetGID”位。这也意味着设置为“x”标志。<br>当在可执行文件上设置'setuid'或者'setgid'标志时,文件将使用文件的所有者和/或者组权限执行。
's'与's'相同,但没有设置'x'标志。此标志很少在文件上使用。
't'如果发现在“其他”三联体中,它会设置“粘性”位。<br>这也意味着设置为“x”标志。此标志对文件无用。
't'与't'相同但没有设置'x'标志。此标志对文件无用。

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

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

|许可|性格|目录中的意思|
| --- - | --- | - - |
|阅读| ' - '|无法显示目录的内容。 |
| | 'r'|目录的内容可以显示。<br>(例如,我们可以列出目录中的文件。)|
|写| ' - '|目录的内容无法更改。 |
| | 'w'|目录的内容可以改变。<br>(例如,我们可以,..etc。)|
|执行| ' - '|目录无法更改为。 |
| | 'x'|可以使用该目录使用。 |
| | 's'|如果在“用户”三联体中找到,它会设置“setuid”位。如果发现在“组”三联体中,它会设置“SetGID”位。这也意味着设置为“X”标志。当“SetGID”标志设置在目录上时,它在其内创建的新文件继承目录组ID(GID)时,而不是创建该文件的用户的主组ID。<br>“setuid”没有影响目录。 |
| | 's'|与's'相同,但没有设置'x'标志。此标志在目录中无用。 |
| | 't'|如果发现在“其他”三联体中,它会设置“粘性”位。<br>这也意味着设置为“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'相同。

如果省略users标志,则默认为'a',并且umask设置的权限不受影响。

第二组标志('[-+ =]')是操作标志,用于定义是否要删除,添加或者设置权限:

  • '-'删除指定的权限。
  • '+'添加指定的权限。
  • '='将当前权限更改为指定的权限。如果在“ =”符号后未指定任何权限,则将删除指定用户类中的所有权限。

可以使用零或者以下一个或者多个字母来显式设置权限('perms ...'):'r','w','x','X','s'和't' 。
将权限从一个用户类复制到另一个用户类时,请使用集合'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
  • 组:r-x = 4 + 0 + 1 = 5
  • 其他:r-x = 4 + 0 + 0 = 4

使用上面的方法,我们得出的数字'754'代表了所需的权限。

要设置“ setuid”,“ setgid”和“ sticky bit”标志,请使用四位数字。

使用4位数字时,第一位数字含义如下:

  • setuid = 4
  • setgid = 2
  • 粘性= 1
  • 无变化= 0

接下来的三位数字与使用三位数字的含义相同。

如果第一个数字为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

例如,以下命令会将“ 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”命令以设置权限。