Linux中的Chmod命令(文件权限)
在Linux中,通过文件许可权,属性和所有权来管理对文件的访问。 这样可以确保只有授权的用户和进程才能访问文件和目录。
本教程介绍了如何使用 chmod
命令以更改文件和目录的访问权限。
Linux文件权限#
在继续之前,让我们解释一下基本的Linux权限模型。
在Linux中,每个文件都与一个所有者和一个组相关联,并为三种不同类别的用户分配了权限访问权限:
- 文件所有者。
- 小组成员。
- 其他人(其他所有人)。
可以使用 chown
和 chgrp
命令。
有三种文件权限类型适用于每个类:
- 读取权限。
- 写入权限。
- 执行权限。
此概念使您可以指定允许哪些用户读取文件,写入文件或执行文件。
可以使用 ls
命令:
ls -l filename.txt
-rw-r--r-- 12 linuxize 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--
)。
这三个权限三元组中的每一个都可以由以下字符构成,并具有不同的效果,具体取决于将它们设置为文件还是目录:
权限对文件的影响
PermissionCharacter的含义读-
该文件不可读。 您无法查看文件内容。r
该文件是可读的。写-
该文件无法更改或修改。w
可以更改或修改文件。执行-
该文件无法执行。x
该文件可以执行。s
如果在 user
三元组设置 setuid
一点。 如果在 group
三胞胎,它设置 setgid
一点。 这也意味着 x
标志被设置。 setuid
要么 setgid
在可执行文件上设置标志,使用文件的所有者和/或组特权执行文件。S
与…一样 s
但是 x
标志未设置。 此标志很少在文件上使用。t
如果在 others
三元组设置 sticky
一点也意味着 x
标志已设置。 该标志在文件上无用。T
与…一样 t
但是 x
标志未设置。 该标志在文件上无用。
权限对目录(文件夹)的影响
在Linux中,目录是包含其他文件和目录的特殊文件类型。
PermissionCharacter在目录上的含义读-
该目录的内容无法显示。r
可以显示目录的内容。(例如,您可以使用 ls
)写-
目录的内容无法更改。w
目录的内容可以更改(例如,您可以创建新文件,删除文件..etc。)执行-
目录不能更改为。x
可以使用以下内容浏览目录 cd
。s
如果在 user
三胞胎,它设置 setuid
一点。 如果在 group
三元组设置 setgid
一点。 这也意味着 x
标志已设置。 当。。。的时候 setgid
在目录上设置了flag时,在其中创建的新文件将继承目录组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
并且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
(读取)= 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
- 粘性= 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
命令来设置权限。
结论#
的 chmod
命令更改文件的权限。 可以使用符号或数字模式设置权限。
要了解更多有关 chmod
访问chmod手册页。
如果您有任何疑问或反馈,请随时发表评论。
chmod终端