文章目录
- 文件权限
- 文件权限的三类用户
- 文件权限的三种类型
- mode 的格式
- 常见的权限设置示例
- umask的作用
- `umask` 的作用
- 例子
- 常见 `umask` 设置
- 通过位操作计算权限
- 解释公式的背景
- 位操作解释
- 具体例子
文件权限
在 Unix/Linux 系统中,文件权限通过 mode
来指定,通常是使用 chmod
命令设置的。mode
是一个八进制数,由三个部分组成,每个部分表示不同的用户组对文件的权限。
文件权限的三类用户
- 文件所有者(Owner)
- 所属组(Group)
- 其他用户(Others)
文件权限的三种类型
- 读(r):值为 4,表示可以读取文件内容。
- 写(w):值为 2,表示可以修改文件内容。
- 执行(x):值为 1,表示可以执行该文件(对于目录,表示可以进入该目录)。
mode 的格式
文件权限由三个数字组成,每个数字分别表示文件所有者、所属组和其他用户的权限。例如,chmod 755 filename
中的 755
是一个八进制数,表示:
- 7:文件所有者(Owner)的权限,7 = 4(读) + 2(写) + 1(执行),即具有读、写、执行权限。
- 5:所属组(Group)的权限,5 = 4(读) + 1(执行),即具有读和执行权限,没有写权限。
- 5:其他用户(Others)的权限,5 = 4(读) + 1(执行),即具有读和执行权限,没有写权限。
常见的权限设置示例
chmod 777 filename
:所有用户都具有读、写、执行权限。chmod 644 filename
:文件所有者可以读写,其他用户只能读。chmod 755 filename
:文件所有者可以读写执行,其他用户只能读和执行。
通过这种方式,可以灵活地为不同的用户组设置文件的权限。
Linux的open()函数也引用了这个参数:Linux系统文件IO
umask的作用
umask
是一个用于控制文件和目录默认权限的系统设置。它在创建新文件或目录时,影响文件系统的权限掩码,从而影响最终设置的权限。
umask
的作用
-
权限掩码:
umask
是一个权限掩码,用于指定在创建新文件或目录时应当“屏蔽”(即剥除)哪些权限位。它不直接设置权限,而是从默认权限中去掉一些权限。 -
默认权限:
- 文件:默认权限通常是
0666
(读写权限,文件创建时)。 - 目录:默认权限通常是
0777
(读写执行权限,目录创建时)。
- 文件:默认权限通常是
-
umask
的工作原理:umask
的值是一个八进制数,用于指定应当去除的权限位。- 新创建文件或目录的权限 = 默认权限 -
umask
。
例子
假设当前的 umask
值为 022
,这表示屏蔽写权限(写权限是 2
,因此去掉了这个权限)。以下是如何计算最终权限的过程:
-
文件的默认权限:
0666
- 去掉的权限:
022
- 最终权限:
0666 - 022 = 0644
- 结果:新文件的权限是
0644
,即所有者具有读写权限,组和其他用户具有读权限。
- 去掉的权限:
-
目录的默认权限:
0777
- 去掉的权限:
022
- 最终权限:
0777 - 022 = 0755
- 结果:新目录的权限是
0755
,即所有者具有读写执行权限,组和其他用户具有读执行权限。
- 去掉的权限:
常见 umask
设置
022
:默认的umask
值,通常用于给文件和目录设置合适的权限,抹掉了同组的其他人和组外人的写权限。002
:允许同组用户写权限,但屏蔽其他用户的写权限。077
:非常严格,只有所有者具有所有权限,其他用户没有权限。
通过位操作计算权限
mode & ~umask
这个公式是用来计算新创建文件或目录的最终权限的。这个公式涉及到位操作,用于在创建文件时应用 umask
。
解释公式的背景
-
默认权限:
- 文件:通常是
0666
(即所有用户都具有读写权限)。 - 目录:通常是
0777
(即所有用户都具有读写执行权限)。
- 文件:通常是
-
umask
:umask
是一个掩码,用于定义在创建文件或目录时哪些权限应该被去掉。它是以八进制表示的。
-
计算方法:
- 新文件或目录的最终权限 = 默认权限 -
umask
。 - 这个计算可以通过位操作实现:
mode & ~umask
。
- 新文件或目录的最终权限 = 默认权限 -
位操作解释
-
~umask
:对umask
进行按位取反(NOT)操作,得到一个掩码,其中umask
中的位被清零,其他位被置为1。- 例如,如果
umask
是022
,其二进制表示为000 000 010 010
。取反后得到111 111 101 101
(八进制表示为755
)。
- 例如,如果
-
mode & ~umask
:通过与操作将mode
中的某些位清零,保留其他位。具体来说,这会将umask
指定的权限位从默认权限中去掉。- 例如,如果
mode
是0666
(文件默认权限),umask
是022
,则~umask
是0755
。执行0666 & 0755
会得到0644
,这就是最终文件权限。
- 例如,如果
具体例子
假设 umask
为 022
,默认权限为 0666
(文件),我们用公式 mode & ~umask
计算最终权限:
-
umask
(八进制):022
- 二进制:
000 000 010 010
- 按位取反:
111 111 101 101
(八进制表示为755
)
- 二进制:
-
默认权限(文件):
0666
- 二进制:
110 110 110 110
- 二进制:
-
计算:
0666 & 0755
- 结果:
0644
(即最终文件权限)