在Linux 系统上使用 Chmod 命令

在Linux 系统上使用 Chmod 命令
在Linux 系统上使用 Chmod 命令

在Linux系统中,我们可以通过 chmod 命令来控制文件及目录的权限,这样就可以确保只有被授权的用户和进程才能够访问特定的文件和目录。对于刚刚接触Linux系统的人,可能感觉这个授权系统很复杂,其实在稍作了解后,就就会感受到它其实非常的简单。

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

在Linux中,磁盘上的每个文件都有一个所有者,并和一个组相关联,并会为三种不同类别的用户身份分配了相应的权限:

  • 文件所有者。默认情况下,文件的创建人就是文件的所有者。
  • 文件所有者所在组的其他成员。每个用户都会归属于一个组,组内可能有其他成员。对于组内成员所有的文件,可以授予组内其他成员相同的权限。
  • 其他用户。其他的任何用户,该用户可能既没有创建文件,也不属于文件所归属的组。

对于每个用户身份,会有三种不同的文件权限类型:

  • 读取权限。拥有读取权限,可以打开和读取文件内容。如果是目录的读取权限,则可以打开目录并能够列出目录中的内容。
  • 写入权限。拥有写入权限,可以写入和修改文件内容。如果是目录的写入权限,则可以添加、删除和重命名目录中的文件。有一种情况是,用户拥有一个文件,但是没有文件所在目录的写入权限,这时我们可以修改文件内容,却不能移动、删除和重命名文件。
  • 执行权限。只有拥有执行权限,才能运行相关的脚本和程序。

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

Linux的用户权限系统决定允许哪些用户读取文件,写入文件或执行文件。我们可以通过使用下面的命令,来查看权限分配情况:

$ ls -l filename.txt
-rw-r--r-- 12 niuqi users 12.0K Apr  8 20:51 filename.txt
|[-][-][-]-   [------] [---]
| |  |  |   |    |       |
| |  |  |   |    |       +-----------> 7. 用户组
| |  |  |   |    +-------------------> 6. 所有者
| |  |  |   +------------------------> 5. 连接数
| |  |  +----------------------------> 4. 其他人权限
| |  +-------------------------------> 3. 用户组权限
| +----------------------------------> 2. 所有者权限
+------------------------------------> 1. 所属类型,文件或者目录。

第一个字符显示文件类型。它可以是常规文件(-),目录(d),符号链接 (l)或任何其他特殊类型的文件。

接下来的9个字符代表对文件的权限,每三个字符分别代表不同用户身份的权限。头三个字符是所有者的权限,接下来三个字符代表所属组的权限,最后三个字符是其他人的权限。根据文件类型的不同,权限可能有不同的含义。

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

对于文件和目录来说,权限的含义稍有不同:

权限字符文件类型
-该文件不可读。用户无法查看文件内容。
r该文件是可读的。
-该文件无法写入或修改。
w可以写入或修改文件。
执行-该文件无法执行。
x可以执行该文件。
s如果在 user 的执行权限位置,它代表setuid。如果在 group 的执行权限位置,它代表 setgid
在可执行文件上设置setuidsetgid,分别代表将以文件的所有者或所在组权限来执行文件。
S与 s 相同,但未设置执行权限。此 S 很少在文件上使用。
t如果在others权限位置中找到,它代表 sticky
这也意味着 x 已设置。该标志对文件无用。
T与 t 相同,但未设置x。该标志对文件无用。
权限字符目录类型
-目录的内容无法显示。
r可以显示目录的内容。
例如,可以使用 ls 列出目录中的文件。
-目录中的内容无法更改。
w目录中的内容可以更改。
例如,可以在目录中创建新文件,删除文件,重命名文件等等。
执行-目录不能更改为。
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 相同。

如果省略users 标记,则默认为a。

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

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

权限(perms...)可以使用下列字母中的一个或多个,rwxXs,和t。将权限从set 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
  • 没有权限 = 0

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

要在数字模式下,授予不同用户身份对文件的不同权限,只需计算所有对应权限值的和就可以了。例如,要授予文件所有者读取,写入和执行权限,授予文件所在组读取和执行权限,而仅授予其他用户读取的权限,可以执行以下操作:

  • 所有者:rwx = 4 + 2 + 1 = 7
  • 所在组:rx = 4 + 0 + 1 = 5
  • 其他人:rx = 4 + 0 + 0 = 4

根据上面的语法规则,我们得出一个三位数字754,7代表所有者拥有读取、写入和执行权限,5代表所在组拥有读取和执行权限,其他人只拥有读取权限。

要设置setuidsetgidsticky bit则要使用4位数来表示。

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

  • setuid = 4
  • setgid = 2
  • sticky = 1
  • 无变化= 0

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

如果第一个数字为0,则可以省略,并且该模式可以用3个数字表示。数值模式0755755相同。

数值模式,还可以使用另一种二进制的方法,但是稍微有点儿复杂。对于大多数用户而言,知道如何使用4、2和1代表的数值模式就足够了。

可以使用以下stat 命令以数字符号检查文件的权限:

stat -c "%a" filename
Output
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

默认情况下,更改符号链接(symlink)的权限时,chmod将更改链接所指向的文件的权限。

chmod 755 symlink

这可能并没有改变 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 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命令以设置权限。

原创文章,作者:牛奇网,如若转载,请注明出处:https://www.niuqi360.com/wordpress/chmod-command-in-linux/

发表评论

登录后才能评论