
在对文件进行操作之前,应先了解文件权限是什么?有哪些权限?
$ tree .
.
├── README.md
├── package.json
└── src
1 directory, 2 files
以上有一个目录和两个文件。然后通过 ls -l 命令,可以查看文件的具体属性:
$ ls -l
total 8
-rw-r--r-- 1 frankie staff 0 7 3 00:18 README.md
-rw-r--r-- 1 frankie staff 90 7 2 22:42 package.json
drwxr-xr-x 2 frankie staff 64 7 2 22:42 src
以 package.json 文件为例,

其中 -rw-r--r-- 首个字符 - 表示「文件类型」,后面的九位字符 rw-r--r-- 表示「文件权限」。
「文件类型」用于表明它是文件、链接文件或者目录等,主要有以下几种:
- 若为 d 则是目录;
- 若为 - 则是文件;
- 若为 l 则表示为链接文件(link file);
- 若为 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若为 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
「文件权限」分为三种身份,分别为文件所有者权限(owner)、文件所在群组权限(group)、其他用户权限(others)。每一种身份都有各自的读写执行权限。通常情况下,一个文件只能归属于一个用户和群组,如果其他用户想拥有此文件的权限,可以将该用户加入到具有权限的群组,一个用户可同时归属于多个群组。
每种身份包括读写和执行权限,其中 r 表示读权限(read),w 表示写权限(write),x 表示执行权限(execute),- 表示无对应权限。除了用 rwx- 形式之外,也可以使用八进制数模式来表示,对应如下:
| 八进制值 | 文件权限 | 权限说明 |
|---|---|---|
| 0 | --- | 无任何权限 |
| 1 | --x | 仅执行权限 |
| 2 | -w- | 仅写权限 |
| 3 | -wx | 有写和执行权限 |
| 4 | r-- | 只读权限 |
| 5 | r-x | 读和执行权限 |
| 6 | rw- | 读写权限 |
| 7 | rwx | 读写和执行权限 |
每种身份的权限数字为 rwx 的累加得出来的。比如,前面 package.json 的权限为 -rw-r--r--,表示文件所有者权限为 rw-(4+2+0),文件所在群组权限为 r--(4+0+0),其他用户权限为 r--(4+0+0),因此该文件的权限数字为 0o644。
我们常用 chmod 命令来修改文件的权限,比如:
$ chmod 755 ./src/bin/test.js
以上的 755 就是表示权限数字,该文件的权限将被改写为 rwxrw-rw-,即所有者可读写可执行,所在群组可读,其他用户可读。
除了数字方式,还可以通过字符方式修改文件权限。形式如:
$ chmod who+operator+permissions <file>
其中 who 表示要更改权限的用户,operator 表示要执行的操作,permissions 表示要更改的权限。
| 符号 | 功能 | 说明 |
|---|---|---|
| u | who | 文件所有者 |
| g | who | 文件所在群组 |
| o | who | 其他用户 |
| a | who | 所有用户 |
| = | operator | 赋值 |
| + | operator | 添加 |
| - | operator | 删除 |
| r | permissions | 读权限 |
| w | permissions | 写权限 |
| x | permissions | 执行权限 |
因此,
$ chmod 755 ./src/bin/test.js
# 相当于
$ chmod u=rwx,g=rw,o=rw ./src/bin/test.js
# 也可对每种用户分别设置
$ chmod u=rwx ./src/bin/test.js
$ chmod g=rw ./src/bin/test.js
$ chmod o=rw ./src/bin/test.js
除了常见的 r/w/x 权限之外,还有一些特殊权限:SUID、SGID 和 SBIT,这里不做展开,有兴趣自行查阅。

