0062. fs 中的 mode
1. 📒 概述
js
fs.writeFileSync('demo.txt', 'Hello', { mode: 0o644 })
fs.mkdirSync('demoDir', { mode: 0o755 })
fs.chmodSync('demo.txt', 0o444)
// 🤔 上面这些 0oxxx 是什么?mode 是什么?有什么用?
// 这篇笔记主要就是介绍这些值的含义。
1
2
3
4
5
6
2
3
4
5
6
fs
模块中的mode
参数- 在 Node.js 的
fs
模块中,mode
是一个与文件权限相关的参数,用于指定文件或目录的访问权限。 - 通过合理使用
mode
,可以控制文件或目录的访问权限,确保程序的安全性和正确性。 - 它通常以八进制数的形式表示(例如
0o666
或0o755
),遵循 Unix 文件权限模型。 - 在实际开发中,需要注意跨平台差异以及系统
umask
的影响。
- 在 Node.js 的
- 什么是
mode
?- 定义:
mode
是一个数字值,表示文件或目录的权限。 - 用途:
- 在创建文件或目录时设置初始权限。
- 修改现有文件或目录的权限(通过
fs.chmod()
)。
- 影响范围:
mode
参数主要用于类 Unix 系统(如 Linux 和 macOS)。- 在 Windows 上,某些权限可能不会生效或行为有所不同。
- 定义:
2. 📒 权限模型
- Unix 文件权限分为三类用户组,每类用户组有三种权限:
用户组 | 符号表示 | 权限含义 |
---|---|---|
所有者 (Owner) | u | 文件或目录的所有者的权限。 |
所属组 (Group) | g | 文件或目录所属组的权限。 |
其他用户 (Others) | o | 其他用户的权限(既不是所有者,也不属于所属组)。 |
- 每类用户组可以拥有以下三种权限:
权限 | 符号表示 | 八进制值 | 含义 |
---|---|---|---|
读 (Read) | r | 4 | 允许读取文件内容或列出目录内容。 |
写 (Write) | w | 2 | 允许修改文件内容或添加/删除目录中的文件。 |
执行 (Execute) | x | 1 | 对于文件:允许作为程序执行; 对于目录:允许进入该目录并访问其子文件或子目录; |
3. 📒 八进制表示法
mode
的值是一个八进制数,由三位或四位数字组成,每位数字表示一组权限的组合。- 格式:
[特殊权限位] [所有者权限] [所属组权限] [其他用户权限]
- 每个权限位的值是上述权限的八进制和(
r=4
,w=2
,x=1
)。 - 如果没有某个权限,则用
0
表示。 - 示例:
0o666
:- 所有者、所属组和其他用户都有读写权限(
rw-rw-rw-
)。
- 所有者、所属组和其他用户都有读写权限(
0o755
:- 所有者有读、写和执行权限(
rwx
),所属组和其他用户只有读和执行权限(r-x
)。
- 所有者有读、写和执行权限(
0o444
:- 所有用户都只有读权限(
r--r--r--
)。
- 所有用户都只有读权限(
4. 📒 特殊权限位
- 在某些情况下,
mode
可能包含额外的特殊权限位(最高位),这些权限位会影响文件或目录的行为。 - 示例:
0o4755
包含 SUID 位(4
),所有者有rwx
权限,所属组和其他用户有r-x
权限。
特殊权限位 | 八进制值 | 含义 |
---|---|---|
Set UID (SUID) | 4 | 当文件被执行时,进程会以文件所有者的权限运行(而非当前用户的权限)。 |
Set GID (SGID) | 2 | 类似 SUID,但适用于文件所属组。 |
Sticky Bit | 1 | 仅对目录有效,限制只有文件所有者才能删除或重命名自己的文件(常用于 /tmp )。 |
5. 📒 mode
的使用场景
- 以下是
mode
在fs
模块中的常见应用场景和方法:- 1️⃣ 创建文件时设置权限 -
fs.writeFileSync()
、fs.writeFile()
。 - 2️⃣ 创建目录时设置权限 -
fs.mkdirSync()
、fs.mkdir()
。 - 3️⃣ 修改现有文件或目录的权限 -
fs.chmodSync()
、fs.chmod()
。
- 1️⃣ 创建文件时设置权限 -
js
const fs = require('fs')
fs.writeFileSync('demo.txt', 'Hello', { mode: 0o644 })
// 设置为 rw-r--r--
// 含义:
// rw- 文件所有者(Owner)拥有读(r)和写(w)权限。
// r-- 文件所属组(Group)只有读(r)权限。
// r-- 其他用户(Others)只有读(r)权限。
1
2
3
4
5
6
7
2
3
4
5
6
7
js
const fs = require('fs')
fs.mkdirSync('demoDir', { mode: 0o755 })
// 设置为 rwxr-xr-x
// 含义:
// rwx 目录所有者(Owner)拥有读(r)、写(w)和执行(x)权限。
// 执行权限(x)对于目录意味着可以进入该目录并访问其内容。
// r-x 目录所属组(Group)拥有读(r)和执行(x)权限,意味着可以查看目录内容,但不能修改目录本身。
// r-x 其他用户(Others)拥有读(r)和执行(x)权限,意味着可以查看目录内容,但不能修改目录本身。
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
js
const fs = require('fs')
fs.chmodSync('demo.txt', 0o444)
// 修改为只读权限
// 相当于设置为 r--r--r--
// 含义:
// r--r--r--
// 文件所有者(Owner)、所属组(Group)和其他用户(Others)都只有读(r)权限。
// 没有写(w)权限,因此文件内容不能被修改。
// 没有执行(x)权限,因此文件不能作为程序执行。
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 读懂权限的含义:
- 🤔 以
rwxr-xr-x
为例,它为何写作0o755
呢? - 在阅读和书写的时候应该以 3 个字母一组。
- 第一组
rwx
表示4 + 2 + 1
也就是7
,表示所有者(Owner)的权限。 - 第二组
r-x
表示4 + 0 + 1
也就是5
,表示所属组(Group)的权限。 - 第三组
r-x
表示4 + 0 + 1
也就是5
,表示其他用户(Others)的权限。 - 最终得到的结果就是
0o755
也就表示权限rwxr-xr-x
。
- 🤔 以
6. 📒 默认权限
- 在 Node.js 中,如果未显式指定
mode
参数,文件或目录的默认权限通常是0o666
(文件)或0o777
(目录)。 - 实际生效的权限还会受到系统
umask
值的影响(umask
会屏蔽某些权限位)。 - 示例:
- 假设系统的
umask
值为0o022
: - 创建文件时,默认权限为
0o666 & ~0o022 = 0o644
(rw-r--r--
)。 - 创建目录时,默认权限为
0o777 & ~0o022 = 0o755
(rwxr-xr-x
)。
- 假设系统的
7. 📒 注意事项
- 跨平台差异:
mode
参数在类 Unix 系统(如 Linux 和 macOS)上效果显著,但在 Windows 上可能无效或行为不同。- 在 Windows 上,建议使用其他方式(如 ACL)管理文件权限。
- 权限冲突:
- 如果文件或目录的权限与系统安全策略冲突,可能会导致操作失败。
- 调试权限问题:
- 使用
fs.stat()
或fs.access()
方法检查文件的实际权限。
- 使用