Linux 是多用户多任务 操作系统,权限是其核心安全机制,通过对用户、用户组、其他用户分配不同操作权限,限制对文件 / 目录的访问、修改、执行等行为,避免资源被非法操作。
Linux 权限的核心围绕3 类主体 、3 种基本权限 展开,同时支持特殊权限 和ACL 扩展权限,适配复杂的权限管理场景。
一、Linux 权限的核心主体
Linux 中每个文件 / 目录都归属一个所有者(用户) 、一个所属用户组 ,其余所有用户归为其他用户,这是权限分配的 3 类核心主体:
- 所有者(User,u) :文件 / 目录的创建者或被指定的拥有者,默认创建者为所有者,可通过
chown修改。 - 所属组(Group,g) :所有者所在的用户组,组内用户可共享该组的权限,可通过
chgrp/chown修改。 - 其他用户(Other,o):既不是所有者,也不在所属组的所有系统用户,是系统的普通访客。
补充 :Linux 中所有用户信息存于/etc/passwd,用户组信息存于/etc/group,可通过cat命令查看。
二、Linux 3 种基本权限
对文件 和目录 ,Linux 定义了读(r)、写(w)、执行(x) 3 种基本权限,r/w/x 对文件和目录的含义完全不同,这是最易混淆的点,核心区别如下:
1. 基本权限的符号与数字表示
Linux 支持符号表示(r/w/x) 和数字表示(八进制),数字表示是权限快速赋值的核心,对应关系为:
- 读(r):4
- 写(w):2
- 执行(x):1
- 无权限(-):0
权限组合 :将对应数字相加,即可得到权限的八进制值(如rwx=4+2+1=7、rw-=4+2=6、r-x=4+1=5)。
2. 权限对「文件」的含义
文件是实际存储数据 / 指令的载体,权限控制「能否读取内容、修改内容、运行指令」:
- r(读,4) :可读取文件内容,如
cat/more/less/head/tail等命令。 - w(写,2) :可修改 / 编辑文件内容,如
vim/echo/sed等命令(注意 :w 权限不包含删除文件,删除文件的权限由父目录的 w 权限决定)。 - x(执行,1) :可将文件作为程序 / 脚本运行,如
./xxx.sh/./a.out(脚本 / 可执行文件必须有 x 权限才能运行)。
3. 权限对「目录」的含义
目录是文件 / 子目录的索引(路径),权限控制「能否查看目录内容、创建 / 删除文件、进入目录」:
- r(读,4) :可列出目录内的文件 / 子目录,即
ls命令(仅 ls,无法进入目录、无法查看文件详情)。 - w(写,2) :可在目录内创建、删除、重命名 文件 / 子目录,如
touch/mkdir/rm/mv(高危权限,赋予需谨慎)。 - x(执行,1) :可进入该目录,即
cd命令(r 权限依赖 x 权限,仅有 r 无 x 时,ls 会提示权限拒绝)。
经典组合:
- 目录
r-x:可 cd 进入 + ls 查看内容,无法创建 / 删除文件(最常用的普通权限)。 - 目录
rwx:完全控制,可进、可看、可增删改(仅所有者 / 管理员可赋予)。 - 目录
--x:可 cd 进入,但无法 ls 查看内容(隐藏目录内容,仅知道具体文件名的用户可访问)。
三、查看文件 / 目录的权限
使用 **ls -l(长列表)命令查看权限,输出结果的第一个字段 ** 即为权限信息,以示例说明:
# 执行 ls -l,输出如下(拆分解读)
-rw-r--r-- 1 root root 123 1月 28 10:00 test.txt # 文件
drwxr-xr-x 2 user user 4096 1月 28 11:00 test_dir # 目录
权限字段拆分(共 10 位)
第 1 位:文件类型 ,后续 9 位分 3 组(每组 3 位),对应u/g/o的 r/w/x 权限:
- 第 1 位 :文件类型标识
-:普通文件d:目录l:软链接(符号链接)b:块设备文件(如硬盘、U 盘)c:字符设备文件(如键盘、鼠标)
- 第 2-4 位 :所有者(u) 权限(如
rw-表示用户有读、写,无执行) - 第 5-7 位 :所属组(g) 权限(如
r--表示组用户仅有读,无写、执行) - 第 8-10 位 :其他用户(o) 权限(如
r--表示其他用户仅有读,无写、执行)
其他字段说明(ls -l)
- 第 2 位:链接数(文件为硬链接数,目录为子目录数 + 1)
- 第 3 位:所有者
- 第 4 位:所属组
- 第 5 位:文件大小(字节,目录固定为 4096)
- 第 6-8 位:修改时间
- 第 9 位:文件名 / 目录名
四、修改权限:chmod 命令
chmod(change mode)是修改文件 / 目录权限的核心命令,支持符号模式 和数字模式,数字模式更简洁高效,符号模式更灵活(适合只修改某类主体的权限)。
语法格式
# 数字模式(推荐,直接赋值u/g/o的权限)
chmod [数字权限] 文件名/目录名
# 符号模式(u/g/o/a +-= r/w/x,a=all=u+g+o)
chmod [主体][操作][权限] 文件名/目录名
关键参数
-R:递归修改,对目录及其下所有文件 / 子目录统一修改权限(目录必加,否则仅修改目录本身)。
1. 数字模式示例(最常用)
核心:将 u/g/o 的权限分别转换为数字,按u-g-o顺序组合成 3 位数字(0-7)。
# 1. 普通文件:用户rw、组r、其他r(644,文件默认权限)
chmod 644 test.txt
# 2. 可执行脚本:用户rwx、组rx、其他rx(755,脚本/程序默认权限)
chmod 755 test.sh
# 3. 目录:用户rwx、组rx、其他---(750,仅所有者和组用户可访问)
chmod -R 750 test_dir
# 4. 完全控制(仅所有者):用户rwx、组---、其他---(700,私密文件/目录)
chmod 700 private.txt
2. 符号模式示例(精准修改)
适合仅修改某类主体的某一项权限,无需重新赋值所有权限:
# 1. 给所有者添加执行权限(u+x)
chmod u+x test.txt
# 2. 给所属组移除写权限(g-w)
chmod g-w test_dir
# 3. 给其他用户设置读和执行权限(o=rx)
chmod o=rx test.sh
# 4. 给所有用户添加写权限(a+w,高危,慎用)
chmod a+w public.txt
# 5. 递归给目录的组用户添加写权限(g+w -R)
chmod -R g+w test_dir
五、修改所有者 / 所属组:chown、chgrp 命令
权限的主体(u/g)可通过命令修改,chown 可同时修改所有者和所属组 ,chgrp 仅修改所属组 ,需root 权限(普通用户仅能修改自己拥有的文件 / 目录)。
1. chown(change owner):修改所有者 / 所属组
语法
# 仅修改所有者
chown 新用户 文件名/目录名
# 同时修改所有者和所属组(用户:组,无空格)
chown 新用户:新组 文件名/目录名
# 递归修改(目录必加-R)
chown -R 新用户:新组 目录名
示例
# 将test.txt的所有者改为user
chown user test.txt
# 将test_dir及其子内容的所有者改为user,所属组改为usergroup
chown -R user:usergroup test_dir
2. chgrp(change group):仅修改所属组
语法
# 仅修改所属组
chgrp 新组 文件名/目录名
# 递归修改
chgrp -R 新组 目录名
示例
chgrp -R usergroup test_dir
六、Linux 默认权限:umask 掩码
Linux 中新建文件 / 目录 会有默认权限 ,由umask(权限掩码) 决定,umask 是「系统默认扣除的权限」,作用于所有新创建的文件 / 目录。
1. 查看 umask 值
umask # 输出4位数字(如0022,第一位为特殊权限掩码,后三位为基本权限掩码)
常用 umask 值:0022(系统默认,普通用户 /root)、0002(组共享环境)。
2. 默认权限计算规则
- 新建目录 :默认最大权限为
777,实际权限 =777 - umask后三位 - 新建文件 :默认最大权限为
666(Linux 规定新建文件无 x 执行权限,防止恶意脚本),实际权限 =666 - umask后三位
3. 计算示例(umask=0022)
# 新建目录:777 - 022 = 755(rwxr-xr-x)
# 新建文件:666 - 022 = 644(rw-r--r--)
这也是 Linux 中新建文件默认644、新建目录默认755的原因。
4. 临时修改 umask(仅当前终端有效)
# 将umask改为0002,新建目录775、新建文件664
umask 0002
永久修改 :编辑/etc/profile(全局)或~/.bashrc(当前用户),添加umask 0002,执行source 文件名生效。
七、Linux 特殊权限(SUID/SGID/Sticky)
除了 r/w/x,Linux 还有 3 种特殊权限 ,用于解决特殊场景的权限问题(如提权执行、组共享目录、防止目录内文件被误删),特殊权限会占用u/g/o 的 x 权限位,用s/S/t/T标识。
1. SUID(Set User ID,设置用户 ID)
- 作用 :普通用户执行某程序时,临时获得该程序「所有者」的权限 (仅对可执行文件有效,目录无 SUID)。
- 标识 :占用所有者(u)的 x 位,若 u 有 x 权限则显示
s,无 x 则显示S。 - 经典示例 :
/usr/bin/passwd(修改密码命令),普通用户可执行该命令修改自己的密码,就是因为 passwd 有 SUID 权限(所有者为 root,执行时临时获得 root 权限,才能修改/etc/shadow(密码文件))。 - 设置 :
chmod u+s 文件名/chmod 4755 文件名(4 为 SUID 的数字标识)。 - 风险 :SUID 是高危权限 ,若给
/bin/bash设置 SUID,普通用户可执行 bash 获得 root 权限,导致系统被攻破,严禁给系统核心命令设置 SUID。
2. SGID(Set Group ID,设置组 ID)
-
作用 1 :对可执行文件:普通用户执行该程序时,临时获得程序「所属组」的权限。
-
作用 2 :对目录 :目录内新建的文件 / 子目录 ,其所属组会继承该目录的所属组 (而非创建者的默认组),适合组共享目录(核心作用)。
-
标识 :占用所属组(g)的 x 位,若 g 有 x 权限则显示
s,无 x 则显示S。 -
设置 :
chmod g+s 文件名/目录名/chmod 2755 文件名/目录名(2 为 SGID 的数字标识)。 -
示例 :创建组共享目录,所有组用户在该目录内创建的文件都归该组所有:
chmod -R 2775 share_dir # 2=SGID,775=用户rwx、组rwx、其他rx
3. Sticky(粘滞位)
- 作用 :对目录 有效,目录内的文件仅所有者、root、目录所有者 可删除 / 重命名,防止组内用户 / 其他用户误删他人文件(即使目录有 w 权限)。
- 标识 :占用其他用户(o)的 x 位,若 o 有 x 权限则显示
t,无 x 则显示T。 - 经典示例 :
/tmp(系统临时目录),所有用户都可在其中创建 / 修改文件,但无法删除他人文件,就是因为/tmp有 Sticky 权限。 - 设置 :
chmod o+t 目录名/chmod 1777 目录名(1 为 Sticky 的数字标识)。
特殊权限的数字组合
特殊权限的数字标识为4(SUID)、2(SGID)、1(Sticky) ,可与基本权限的 3 位数字组合成4 位数字,如:
4755= SUID + u=rwx、g=rx、o=rx2775= SGID + u=rwx、g=rwx、o=rx1777= Sticky + u=rwx、g=rwx、o=rwx
八、ACL 扩展权限(解决 3 类主体的局限)
Linux 基本权限仅支持u/g/o 3 类主体,无法给单个用户 / 单个组 单独分配权限(如给用户test单独赋予test_dir的 rw 权限,其他用户无),此时需要ACL(Access Control List,访问控制列表) 扩展权限。
ACL 允许给任意多个用户、任意多个组分别分配独立的权限,是基本权限的补充,需确保文件系统支持(主流 Linux 发行版默认支持)。
1. 查看 ACL 权限:getfacl
# 查看文件/目录的ACL权限
getfacl test.txt
getfacl test_dir
2. 设置 ACL 权限:setfacl
核心参数
-m:添加 / 修改ACL 规则(modify)-x:删除ACL 规则(remove)-b:清除所有ACL 规则(backup)-R:递归设置(目录)
语法与示例
# 1. 给单个用户添加权限:u:用户名:权限
setfacl -m u:test:rwx test_dir # 给用户test赋予test_dir的rwx权限
# 2. 给单个组添加权限:g:组名:权限
setfacl -m g:testgroup:rx test_dir # 给组testgroup赋予rx权限
# 3. 递归给目录添加ACL规则(-R)
setfacl -R -m u:test:rwx test_dir
# 4. 删除单个用户的ACL规则
setfacl -x u:test test_dir
# 5. 清除所有ACL规则
setfacl -b test_dir
3. 查看 ACL 权限的 ls -l 标识
添加 ACL 权限后,ls -l的权限字段最后一位 会显示 **+**,表示该文件 / 目录有 ACL 扩展权限:
drwxrwxr-x+ 2 root root 4096 1月 28 14:00 test_dir
九、Linux 权限管理的核心原则(安全规范)
- 最小权限原则:仅给用户 / 组赋予「完成工作所需的最小权限」,不赋予多余权限(如普通用户无需 w 权限的目录,绝不赋予)。
- 目录与文件权限分离 :文件默认
644(rw-r--r--),目录默认755(rwxr-xr-x),可执行脚本默认755,私密文件 / 目录设为700。 - 慎用高危权限 :
- 避免给其他用户(o)赋予 w/x 权限;
- 严禁给系统核心命令(如 bash、ls、cp)设置 SUID;
- 目录的 w 权限仅赋予所有者 / 管理员,组共享目录用SGID+2775替代。
- 组共享用 SGID+ACL:多用户共享目录时,优先使用 SGID(继承组)+ ACL(单独赋权),而非直接给组赋予 w 权限。
- /tmp 目录保护 :确保
/tmp的 Sticky 权限(1777)不被修改,防止用户误删他人文件。 - root 权限慎用 :尽量用普通用户操作,仅需管理员权限时用
sudo,避免直接登录 root(防止误操作删除系统文件)。
十、常用权限速查表(必记)
| 权限数字 | 符号权限 | 适用对象 | 场景说明 |
|---|---|---|---|
| 644 | rw-r--r-- | 普通文件 | 系统默认,所有者可读写,组 / 其他仅读 |
| 755 | rwxr-xr-x | 脚本 / 程序 / 目录 | 可执行文件 / 公共目录,所有者完全控制,组 / 其他可访问 / 执行 |
| 700 | rwx------ | 私密文件 / 目录 | 仅所有者可访问,组 / 其他无任何权限(如个人配置文件) |
| 750 | rwxr-x--- | 内部共享目录 | 所有者完全控制,组用户可访问,其他用户无权限 |
| 2775 | rwxrwsr-x | 组共享目录 | SGID + 组可读写,目录内新文件继承组,其他用户仅读 |
| 1777 | rwxrwxrwt | 公共临时目录 | Sticky,所有用户可创建 / 修改,不可删除他人文件(如 /tmp) |
| 4755 | rwsr-xr-x | 特殊可执行文件 | SUID,普通用户执行时临时获得所有者权限(如 passwd) |