linux文件权限是系统安全机制的核心组成部分,每一个文件或目录的权限信息都存储在文件系统的inode节点中,这些信息决定了不同用户对该文件的操作范围。理解权限中保存的具体内容,是进行linux系统管理和权限配置的基础。

linux文件权限的基础构成
通过ls -l命令查看文件时,第一列显示的字符串就是权限信息的直观展示,比如-rwxr-xr--,这串字符包含的信息可以分为三个部分:
- 第一个字符表示文件类型,常见的有
-普通文件、d目录、l软链接、c字符设备、b块设备等 - 接下来的9个字符分为三组,每组3个,分别对应所有者(user)、所属组(group)、其他用户(other)的权限
- 每组权限的三个字符依次是读(r)、写(w)、执行(x)权限,对应位置有字符表示拥有该权限,是
-表示无该权限
权限中保存的用户和组信息
除了权限位本身,文件权限信息还关联了所有者和所属组的ID,这两个ID存储在inode的元数据中,系统通过/etc/passwd和/etc/group文件将ID映射为对应的用户名和组名。
可以通过stat命令查看更详细的权限相关信息,示例如下:
# 查看test.txt文件的详细权限信息 stat test.txt # 输出示例 # File: test.txt # Size: 12 Blocks: 8 IO Block: 4096 regular file # Device: 801h/2049d Inode: 131072 Links: 1 # Access: (0754/-rwxr-xr--) Uid: ( 1000/ testuser) Gid: ( 1000/ testuser) # Access: 2024-05-20 10:00:00.000000000 +0800 # Modify: 2024-05-20 10:00:00.000000000 +0800 # Change: 2024-05-20 10:00:00.000000000 +0800 # Birth: -
上述输出中Uid和Gid就是文件所有者和所属组的ID及对应名称,Access后的0754是权限的八进制表示,对应rwxr-xr--的权限位。
特殊权限位的存储
除了基础的rwx权限,linux文件权限还包含三个特殊权限位:SUID、SGID、SBIT,这三个权限会占用权限位的执行权限位置,显示时会用特殊字符标识:
- SUID:所有者执行位如果是
s表示开启,S表示原执行位无权限但开启了SUID - SGID:所属组执行位如果是
s表示开启,S表示原执行位无权限但开启了SGID - SBIT:其他用户执行位如果是
t表示开启,T表示原执行位无权限但开启了SBIT
特殊权限的八进制表示是在基础权限前加一位,SUID是4,SGID是2,SBIT是1,比如4754就表示开启了SUID,基础权限是rwxr-xr--。
权限相关的其他元数据
文件权限信息还关联了三个时间戳,这些时间也和权限的访问修改相关:
| 时间戳类型 | 含义 | 触发修改的操作 |
|---|---|---|
| atime(访问时间) | 文件内容最后一次被读取的时间 | cat、less等读取文件内容的操作 |
| mtime(修改时间) | 文件内容最后一次被修改的时间 | echo、vim编辑等修改内容的操作 |
| ctime(状态改变时间) | 文件权限、所有者等元数据最后一次修改的时间 | chmod、chown等修改权限或所有者的操作 |
权限信息的修改方式
可以通过chmod命令修改文件的权限位,通过chown命令修改文件的所有者和所属组,示例如下:
# 给test.txt文件的所有者添加执行权限 chmod u+x test.txt # 将test.txt的所有者改为root,所属组改为root chown root:root test.txt # 用八进制方式设置test.txt的权限为rwxr-xr-- chmod 754 test.txt # 给test.txt添加SUID权限 chmod u+s test.txt
另外umask值会影响新创建文件的默认权限,umask的值是权限的掩码,新建文件的默认权限是基础权限减去umask值,普通文件基础权限是666,目录基础权限是777。
# 查看当前umask值 umask # 输出示例:0022 # 新建文件的默认权限就是666-022=644,即rw-r--r-- # 新建目录的默认权限就是777-022=755,即rwxr-xr-x # 临时修改umask值为002 umask 002