在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
或任何其他特殊类型的文件。
接下来的9个字符代表文件权限,每三个字符为一组。第一组显示所有者权限,第二组显示组的权限,最后一组显示其它人的权限。根据文件类型,权限可能具有不同的含义。
在上面的示例中rw-r--r--
表示文件所有者具有读写权限rw-
,组和其他组仅具有读取权限r--
。
三个权限组中的每一个都可以由rwx字符构成,并具有不同的效果,具体取决于将它们为文件还是目录设置。
文件权限
文件读权限,-
表示文件不可读。您将无法查看文件内容。r
表示文件是可读的。
文件写权限,-
表示文件无法更改或修改。w
表示可以被更改或修改文件。
文件执行权限,-
表示文件不可执行。x
表示文件可执行。
如果在用户三元组中找到s
,它将设置文件setuid位。如果在group的三元组中找到s
,它将设置组的setgid位。在可执行文件的上用s
表示,不可执行的文件时S
表示。
在可执行文件上同时设置setuid或setgid标志时,将使用文件的所有者和/或组权限来执行文件。
换句话说,如果文件为root用户所有,当你以普通用户运行时此文件时,都是root的权限执行此文件,在对文件设置setuid时,你必须清楚自己在做什么。
如果在其他人三元组中找到t
标识,它将设置文件的sticky位。t
标识在文件中不起作用,t
标识仅影响文件夹。
T
与t
相同,但T
在未设置可执行权限的文件夹/文件中出现,如果你给在有T
的文件/文件夹中增加可执行权限,它将会表为t
。
目录权限
在Linux中,目录是包含其他文件和目录的特殊文件类型。
读权限:-
目录的内容无法显示。r
可以显示目录的内容。比如,您使用ls命令列出目录内的文件。
写权限:-
目录的内容无法更改。w
目录的内容可以更改。例如,您不能创建新文件,删除文件等。
执行权限:-
不能使用cd命令切换到该目录。x
可以使用cd浏览目录。
在目录上设置setuid位后,在该目录内创建的新文件将继承目录组的GID,而不是创建文件用户的主要组的GID。
setuid位对目录没有影响。S
与s
相同,但S
未设置可执行权限。此标志在目录上不起作用。
如果在其它人others的三元组中具有t
标识,它将设置sticky位。与t相同,但T
未设置可执行权限文件或者目录中出现。
在目录上设置粘滞sticky位后,只有文件的所有者或root用户才能删除或重命名目录中的文件。
/tmp
目录就是个例子,在/tmp
中创建的文件,只能由创建者删除该文件。即谁创建的谁删,其它人不能删除,但root用户除外。
chmod
这是chmod
命令的一般形式chmod [OPTIONS] MODE FILE...
。chmod
命令允许您使用符号模式,数字模式或参考文件来更改文件的权限。
我们将在本文后面详细解释这些模式。chmod命令可以接受一个或多个用空格分隔的文件/目录作为参数。
只有root用户,文件所有者或具有sudo权限的用户才能更改文件的权限。使用chmod
时要格外小心,尤其是在递归更改权限时。
符号模式
使用符号模式时,chmod
命令的语法的格式是chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE...
,这也是最不常用的模式,一般很少会用到。
[ugoa…]
标识定义用户拥有该文件的权限。u
表示为文件所有者设置权限。g
为文件所属组设置权限。o
为其他用户设置用户权限。
a表示为所有用户设置权限,等同于ugo。如果省略了用户标识,则默认值为a也就是为文件所有者,组,其他人设置权限。并且umask设置的权限不受影响。
[-+=]
是即操作标识,定义是否要删除,添加或设置/修改权限:-
删除指定的权限。+
添加指定的权限。=
将当前权限更改为指定的权限。如果在=
符号后未指定任何权限,则将删除所有权限。
可以使用零个,一个或多个字母来明确设置的权限: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 u=rwx,g=r,o= filename
授予文件所有者的读取,写入和执行权限,授予组的读取权限,而不授予其他人的权限:
命令chmod g+u filename
将文件的所有者权限添加到组成员中。chmod o+t dirname
向指定目录添加粘性位。
数字模式
使用数字模式时,chmod
命令的语法形式是chmod [OPTIONS] NUMBER FILE...
。
在使用数字模式时,您可以同时设置三个类别。分别是所有者,组和所有其他人的权限。
NUMBER
可以是3或4位数字。当使用3位数字时,第一位代表文件所有者的权限,第二位代表文件组的权限,最后一位代表所有其他人的权限。
写入,读取和执行权限都可以由数字的值表示,4表示读的权限r
,2表示写权限w
,1表示执行权限x
,0表示没有无权限。
特定类别的权限编号由该组的权限值的总和表示。要在数字模式下查找文件的权限,只需计算所有类别的总数。
例如,要授予文件所有者的读取,写入和执行权限。所有者的权限则为rwx = 4 + 2 + 1 = 7。
授予文件组的读取和执行权限,则组的权限为rx = 4 + 0 + 1 = 5。而仅授予其他人读取权限,其他人的权限为:rx = 4 + 0 + 0 = 4
使用上述方法,我们得出了代表所需权限的数字754
。要设置setuid
,setgid
和sticky bit
标识,请使用四位数。
使用4位数字时,第一位数字可以是4,2,1。4是setuid,2是setgid,1是sticky,0表示无更改。之后的三位数字与使用3位数字的含义相同。
如果第一位数字为0,则可以省略,并且该模式可以用3位数字表示。例如数字模式的0755
与755
相同。
要计算数字模式,您还可以使用另一种二进制方法,但是稍微复杂一点。对于大多数用户来说,知道如何使用4、2和1计算数字模式就足够了。
您可以使用stat -c "%a" filename
命令以数字模式检查文件的权限。以下是在数字模式下如何使用chmod
命令的一些示例。
命令chmod 644 dirname
授予文件所有者读取和写入权限,并且仅向组成员和其他人授予读取权限。
命令chmod 750 dirname
授予文件所有者读取,写入和执行的权限,对组成员的读取和执行的权限,对其他人移除权限。
命令chmod 1777 dirname
授予所有用户授予读取,写入和执行权限并设置sticky位。
命令chmod -R 700 dirname
递归设置文件所有者的读取,写入和执行权限,除了所有者拥有权限外,其它用户的权限都移除。
chmod示例
使用参考文件修改权限,chomd的--reference=ref_file
选项可让您将文件的权限设置为与指定参考文件的权限一样。例如,命令chmod --reference=file1 file2
会将file1
的权限分配给file2
要递归修改指定目录下的所有文件和目录,请使用chmod的-R
选项。
例如,要将/var/www
目录下的所有文件和子目录的权限更改为755
,可以使用命令chmod -R 755 /var/www
。
在符号链接修改权限,符号链接始终具有777
权限。默认情况下,更改符号链接的权限时,chmod
将更改链接指向的文件的权限。
如果你尝试修改符号链接的权限,您将收到无法访问symlink:拒绝权限
错误,之所以发生该错误,是因为默认情况下,大多数Linux发行版上的符号链接都受到保护,
您无法在目标文件上进行修改。此选项在/proc/sys/fs/protected_symlinks
中指定。 1
表示启用,0
表示禁用。建议不要禁用符号链接保护。
有时候,您需要批量更改文件和目录的权限。最常见的情况是将网站文件的权限递归更改为644
,目录的权限更改为755
。
你可以使用find
命令在/var/www/my_website
下搜索文件和目录,并将找到的每个文件和目录传递给chmod
命令以设置权限。
使用数字方法:
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 {} \;
结论
chmod
命令更改文件的权限。可以使用符号或数字模式设置权限。要详细了解chmod
,请访问 chmod手册页面。如果您有任何问题或反馈,请随时发表评论。