在Linux中,文件权限、属性和所有权控制着系统进程和用户对文件的访问级别。这可以确保只有授权的用户和进程可以访问特定的文件和目录。
Linux的文件权限
基本的Linux权限模型的工作原理是将每个系统文件与一个所有者和一个组联系起来,并为三个不同类别的用户分配权限访问权。
- 文件所有者。
- 组成员。
- 其他人(其他所有人)。
文件所有权可以通过chown和chgrp命令来改变。
三种文件权限类型适用于每个类别的用户。
- 读取权限。
- 写入权限。
- 执行权限。
这个概念允许你控制哪些用户可以读取文件,写到文件,或执行文件。
要查看文件的权限,请使用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 | 文件是可读的。 | |
写 | - | 该文件不能被改变或修改。 |
w | 该文件可以被改变或修改。 | |
执行 | - | 该文件不能被执行。 |
x | 该文件可以被执行。 | |
s | 如果在用户三联体中发现,它设置setuid位。如果在组的三联体中发现,它设置setgid位。这也意味着x标志被设置。 当setuid或setgid标志在一个可执行文件上被设置时,该文件将以该文件的所有者和/或组的权限执行。 | |
S | 与s相同,但不设置x标志。这个标志很少在文件上使用。 | |
t | 如果在其他人的三联体中发现,它设置粘性位。 它也意味着x标志被设置。这个标志在文件上是无用的。 | |
T | 与t相同,但x标志不被设置。这个标志在文件上是无用的。 |
权限对目录(文件夹)的影响
目录是特殊类型的文件,可以包含其他文件和目录。
权限 | 字符 | 对目录的意义 |
---|---|---|
读取 | - | 不能显示该目录的内容。 |
r | 该目录 (例如,你可以用ls列出目录内的文件。) | |
写入 | - | 该目录的内容不能被改变。 |
w | 该目录的内容可以被改变。 (例如,你可以创建新的文件,删除文件……等等) | |
执行 | - | 该目录不能被改变到。 |
x | 该目录可以使用cd导航。 | |
s | 如果在用户三联体中发现,它将设置setuid位。如果在组的三要素中发现,它会设置setgid位。这也意味着x标志被设置。当setgid标志在一个目录上被设置时,在其中创建的新文件会继承目录组ID(GID)而不是创建文件的用户的主组ID。Setuid 对目录没有影响。 | |
S | 与s相同,但不设置x标志。这个标志对目录无用。 | |
t | 如果在其他人的三联体中发现,它设置粘性位。 这也意味着x标志被设置。当目录上的粘性位被设置时,只有文件的所有者、目录的所有者或管理用户可以删除或重命名该目录中的文件。 | |
T | 与t相同,但x标志没有被设置。这个标志在目录上是无用的。 |
改变文件权限
文件权限可以用chmod命令来改变。只有root、文件所有者或具有sudo权限的用户可以改变文件的权限。在使用chmod时要特别小心,特别是在递归改变权限时。该命令可以接受一个或多个以空格分隔的文件和/或目录作为参数。
权限可以用符号模式、数字模式或参考文件来指定。
符号(文本)方式
使用符号模式时,chmod命令的语法有以下格式。
chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE...
第一组标志([ugoa…]),即用户标志,定义了文件权限被改变的用户类别。
- u – 文件所有者。
- g – 该组成员的用户。
- o – 所有其他用户。
- a – 所有用户,与ugo相同。
当用户的标志被省略时,它默认为a。
第二组标志([-+=]),即操作标志,定义了权限是要被移除、添加还是设置。
- – 移除指定的权限。
- + – 增加指定的权限。
- = – 将当前权限改为指定的权限。如果在=符号后面没有给出权限,那么指定用户类别的所有权限都会被删除。
权限(perms…)是用0或以下一个或多个字母明确设置的:r, w, x, X, s, and t. 当从一个用户类复制权限到另一个用户类时,使用u、g和o这一组的单个字母。
当为多个用户类设置权限时([,…]),使用逗号(没有空格)来分隔符号模式。
下面是一些如何在符号模式下使用chmod命令的例子。
- 给予组内成员执行文件的权限,但不能读写文件。
chmod g=x filename
删除所有用户的写权限。
chmod a-w filename
递归地删除其他用户的执行权限。
chmod -R o-x dirname
删除所有用户的读、写和执行权限,除了该文件自己的用户。
chmod og-rwx filename
同样的事情也可以通过使用以下形式来完成。
chmod og= filename
给予文件所有者以读、写和执行的权限,给予文件组以读的权限,不给予所有其他用户任何权限。
chmod u=rwx,g=r,o= filename
数值法
使用符号模式时,chmod命令的语法有如下格式。
chmod [OPTIONS] NUMBER FILE...
当使用数字模式时,你可以同时设置所有三个用户类别(所有者、组和所有其他人)的权限。
权限号可以是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位数的数字。
当使用4位数字时,第一位数字有如下含义。
- setuid=4
- setgid=2
- 粘性=1
- 无变化=0
接下来的三位数与使用3位数时的意义相同。
如果第一个数字是0,它可以省略,模式可以用3位数字表示。数字模式0755与755相同。
要计算数字模式,你也可以使用另一种方法(二进制方法),但它有点复杂。知道如何使用4、2和1来计算数字模式,对大多数用户来说已经足够了。
你可以使用stat命令检查文件在数字模式下的权限。
stat -c "%a" file_name
下面是一些关于如何在数字模式下使用chmod命令的例子。
- 给予文件的所有者读和写的权限,只给小组成员和所有其他用户读的权限。
chmod 644 dirname
给予文件所有者读、写和执行的权限,给小组成员读和执行的权限,不给所有其他用户任何权限。
chmod 750 dirname
给予读取、写入和执行的权限,并给指定目录一个粘性位。
chmod 1777 dirname
递归地给文件所有者设置读、写和执行的权限,而对给定目录上的所有其他用户没有权限。
chmod -R 700 dirname
结论
在Linux中,对文件的访问是通过文件权限、属性和所有权来限制的。要改变文件的权限,请使用chmod命令。