Linux 文件与目录权限
基本权限
基本权限有三种,分别是:读(r,Read)、写(w,Write)、执行(x,eXecute)。
同样的权限标记对于文件和目录代表不同的意义。
文件权限
文件包括一般文本文件、数据库和二进制可执行文件。文件权限只针对文件内容而言,和改名、删除等操作无关。
数字 | 字符 | 权限 |
---|---|---|
4 | r | 读取文件内容。例如使用 cat 命令查看,使用 vim 以只读方式打开。 |
2 | w | 编辑修改文件内容,但不包括删除文件。例如使用 vim 、sed 等对文件内容进行修改并保存。 |
1 | x | 文件具有可以被系统执行的权限。例如命令和脚本必须拥有此权限才能直接执行。 |
目录权限
目录主要的内容是记录文件名清单,所以目录权限实际关联的是目录下文件属性查看与更改。
数字 | 字符 | 权限 |
---|---|---|
4 | r | 仅查询目录下的文件或目录名称,无法看到属性,相当于执行不加参数的 ls 命令。 |
2 | w | 改变目录结构清单权限,也就是在目录下新建、删除、重命名文件或目录。 |
1 | x | 进入目录的权限,查询目录下的文件属性。 |
权限参考
根据使用场景来配置权限。
用户进入目录所需权限:
- 目录需要 x 权限,来运行
cd
切换目录。 - 目录需要 r 权限,来使用
ls
命令查看目录中文件列表。
用户读取目录内文件所需权限:
- 目录需要 x 权限来进入目录。
- 文件需要 r 权限来运行
cat
、more
等读取文件命令。
用户修改目录内文件所需权限:
- 目录需要 x 权限来进入目录。
- 文件需要 r 和 w 权限来使用
vi
等工具进行文件读写。
用户创建一个文件所需权限:
- 目录需要 w 和 x 权限来创建文件。
用户执行目录下的命令所需权限:
- 目录需要 x 权限来进入目录。
- 文件需要 x 权限来运行命令。
特殊权限
在 Linux 系统中,还有一些特殊权限。
SUID
当 s 标志出现在文件所有者的 x 权限上时,被称为 Set UID,其含义为:
- SUID 权限仅对二进制程序有效,不能用在脚本上;
- 执行者对该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中(run-time)有效;
- 执行者将具有该程序所有者的权限。
例如一般用户运行 passwd
命令修改密码,需要修改 /etc/shadow
文件。但是该文件的权限只有 root 可读写,而用户运行 passwd 程序时,会暂时获得 passwd 程序的 root 权限,从而可以通过 passwd
命令修改 /etc/shadow
文件。
这是因为运行 passwd
后会启动一个新的进程,该进程会产生一个新的 PID。在该 PID 产生时,SUID 会给予该 PID 特殊的权限设置,使得执行者在该进程中具有该程序所有者的权限。
SGID
当 s 标志出现在文件所属组的 x 权限上时,被称为 Set GID。SGID 可以针对文件或目录来设置。
针对文件,SGID 有以下功能:
- SGID 对二进制程序有效;
- 程序执行者对该程序来说,需要具备 x 的权限;
- 执行者在执行的过程中将会获得该程序所属组的权限。
例如,一般用户使用 locate
这个程序可以查询 /var/lib/mlocate/mlocate.db
文件的内容,会暂时获得 slocate 用户组的权限。
针对目录,SGID 有以下功能:
- 用户若对此目录具有 r 和 x 的权限时,该用户能够进入此目录;
- 用户在此目录下的有效用户组将会变成该目录的用户组;
- 若用户在此目录下具有 w 的权限,则用户所创建的新文件的所属组与此目录的所属组相同。
SBIT
当 t 出现在文件所有者的其他用户 x 权限上时,被称为 Sticky Bit。其含义为:
- SBIT 权限仅对目录有效;
- 当用户对该目录具有 w 和 x 权限时,即具有写入权限时;
- 当用户在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件。
例如,用户 1 对目录 A 具有 w 的权限,里面还有其他用户的文件。此时,目录 A 加上了 SBIT 权限时,用户 1 只能修改自己创建的文件,无法删除他人文件。