一、文件权限的基本概念
Linux 文件系统的权限体系基于三类用户和三种权限的组合,形成了灵活且严谨的访问控制模型。
1. 三类用户
- 所有者(User):文件的创建者或被指定的用户,对文件拥有最高级别的控制权。
- 所属组(Group):包含多个用户的集合,用于实现团队内的权限共享。
- 其他用户(Other):系统中除所有者和所属组成员之外的所有用户,代表最广泛的访问范围。
2. 三种基础权限
- 读取(r):对文件而言,允许查看文件内容;对目录而言,允许列出目录中的文件和子目录。
- 写入(w):对文件而言,允许修改文件内容;对目录而言,允许创建、删除或重命名目录中的文件。
- 执行(x) :对文件而言,允许将文件作为程序或脚本运行;对目录而言,允许进入该目录(通过
cd命令)。
二、权限的表示与查看
Linux 权限可以通过字符或数字两种方式表示,使用ls -l命令可查看文件或目录的权限信息。
1. 字符表示法
以-rw-r--r--为例,该字符串分为四部分:
- 第一个字符:表示文件类型(
-为普通文件,d为目录,l为符号链接等)。 - 接下来三组字符(每组 3 个):分别对应所有者、所属组、其他用户的权限,每组内的字符依次表示
r(读取)、w(写入)、x(执行),若权限不存在则用-表示。
例如:
drwxr-xr-x:表示目录,所有者拥有读、写、执行权限,所属组和其他用户拥有读和执行权限。-rwx------:表示普通文件,仅所有者拥有读、写、执行权限。
2. 数字表示法
数字表示法将权限转换为八进制数值,便于通过命令快速设置权限:
r对应4,w对应2,x对应1,无权限对应0。- 每组权限的数值为三种权限的总和,例如:
rwx= 4+2+1 = 7rw-= 4+2 = 6r-x= 4+1 = 5r--= 4---= 0
完整的权限数值由三组数字组成,分别对应所有者、所属组、其他用户的权限,例如755表示所有者拥有rwx,所属组和其他用户拥有r-x。
三、权限的修改方法
修改文件或目录的权限需要使用chmod命令,修改所有者和所属组需使用chown和chgrp命令。
1. 修改权限:chmod
-
字符模式 :通过
u(所有者)、g(所属组)、o(其他用户)、a(所有用户)指定对象,结合+(添加)、-(移除)、=(设置)操作符修改权限。- 示例 1:为文件
file.txt的所有者添加执行权限
chmod u+x file.txt - 示例 2:移除目录
docs的所属组和其他用户的写入权限
chmod go-w docs - 示例 3:将
script.sh的权限设置为所有者可读可写可执行,所属组和其他用户可读可执行
chmod u=rwx,go=rx script.sh
- 示例 1:为文件
-
数字模式:直接通过三组数字设置权限。
- 示例:将
data目录的权限设置为rwxr-x---(所有者rwx,所属组r-x,其他用户无权限)
chmod 750 data
- 示例:将
2. 修改所有者和所属组
-
修改所有者 :使用
chown命令,格式为chown 新所有者 文件名。示例:将
file.txt的所有者改为user1
chown user1 file.txt -
修改所属组 :使用
chgrp命令,格式为chgrp 新组名 文件名;或通过chown同时修改所有者和所属组(格式:chown 所有者:组名 文件名)。示例 1:将
docs目录的所属组改为team1
chgrp team1 docs示例 2:将
report.pdf的所有者改为user2,所属组改为team2
chown user2:team2 report.pdf -
递归修改 :添加
-R选项可递归修改目录及其子目录中所有文件的权限或所有权。示例:递归修改
project目录的所属组为dev
chgrp -R dev project
四、特殊权限与默认权限
除基础权限外,Linux 还支持特殊权限和默认权限(umask),用于满足复杂场景的需求。
1. 特殊权限
-
SetUID(SUID) :文件所有者的权限位中
x变为s,允许用户以文件所有者的身份执行该文件(仅对可执行文件有效)。示例:为
/bin/passwd设置 SUID(允许普通用户修改自己的密码,实际以 root 身份执行)
chmod u+s /bin/passwd -
SetGID(SGID) :所属组的权限位中
x变为s,对文件而言,执行时以所属组身份运行;对目录而言,目录中新建文件的所属组与该目录一致。示例:为
shared目录设置 SGID(确保团队成员在该目录中创建的文件均属于team组)
chmod g+s shared -
粘滞位(Sticky Bit) :其他用户的权限位中
x变为t,用于目录时,仅文件所有者或 root 可删除该目录中的文件(防止误删共享目录中的文件)。示例:为
/tmp设置粘滞位(系统默认已设置)
chmod o+t /tmp
特殊权限的数字表示:SUID 对应4,SGID 对应2,粘滞位对应1,需添加在三组基础权限数字之前,例如4755(SUID+755)、2770(SGID+770)、1777(粘滞位 + 777)。
2. 默认权限:umask
umask(用户文件创建掩码)用于控制新建文件和目录的默认权限,它通过从最大权限中 "减去" 相应值来生效:
- 新建文件的最大权限为
666(无执行权限,需手动添加),新建目录的最大权限为777。 - umask 的默认值通常为
0022(普通用户)或0077(root 用户),表示:- 普通用户新建文件默认权限:
666 - 022 = 644(rw-r--r--) - 普通用户新建目录默认权限:
777 - 022 = 755(drwxr-xr-x)
- 普通用户新建文件默认权限:
修改 umask:直接在命令行输入umask 新值(临时生效),或在~/.bashrc(用户级)、/etc/profile(系统级)中添加配置(永久生效)。
示例:将当前 shell 的 umask 设置为0007(新建文件权限为660,目录为770)
umask 0007