Re:Linux系统篇(四):权限Chapter--用户身份、权限位与目录权限三大核心问题


观众老爷们大家好 这里是邪修KING的独家频道 本文属于系列Linux系统篇 ------操作指令 一起学Linux的小伙伴可订阅专栏: Linux系统篇

概述&序言

上一篇我们在结尾留下了一个思考题:同样一条命令,为什么 root 用户可以畅通无阻,普通用户却常常提示「Permission denied」?Shell 命令行解释器在执行命令前,核心工作之一就是做权限校验。

权限是 Linux 多用户操作系统的安全基石,也是整个 Linux 体系中最核心的概念之一。从文件访问、软件安装到系统配置,所有操作都绕不开权限校验。本章我们从用户身份出发,逐层拆解权限的角色划分、权限位含义、修改方法,并深度剖析三个最容易混淆的核心问题:目录的 rwx 到底是什么、默认权限由什么决定、文件删除权到底归谁。

一、Linux 用户体系:超级用户与普通用户

1.1 两类用户

和 Windows 系统的「管理员账户 / 普通账户」分类类似,Linux 系统也将用户分为两大类:

用户类型 权限特点 代表
超级用户(root) 权限不受任何约束,可以操作系统内的一切资源,相当于系统的上帝 用户名固定为 root,命令提示符为 #
普通用户 权限受限,只能在自己的权限范围内操作,不能修改系统级配置,不能访问其他用户的私有资源 自建用户,命令提示符为 $

设计两类用户的核心目的是安全:日常使用普通用户操作,避免误操作破坏系统;只有需要管理系统时才提升到 root 权限。

1.2 su 指令:切换用户身份

su 全称 Switch User ,用于在不同用户身份之间切换。

语法与常用用法

bash 复制代码
# 1. 切换到指定用户(需要输入目标用户的密码)
su 用户名

# 2. 切换到 root 用户(需要输入 root 密码)
su

# 3. 切换用户并重新加载环境变量(切换到目标用户的家目录,推荐使用)
su - 用户名
su - root

关键细节

普通用户 → root / 其他用户 :需要输入目标用户的密码,验证通过才能切换。

root → 任意普通用户 :不需要输入密码,直接切换成功。因为 root 权限最高,不需要验证。

su 和 su - 的区别:

su 用户名:只切换身份,不切换工作目录和环境变量,还停留在当前目录

su - 用户名:完全切换,包括工作目录切换到目标用户的家目录,重新加载用户环境变量,更彻底

示例:

bash 复制代码
# 当前是普通用户 ubuntu
ubuntu@VM-0-16-ubuntu:~$ su - root
Password:    # 输入 root 密码
root@VM-0-16-ubuntu:~#    # 切换成功,提示符变成 #

# root 切回普通用户,无需密码
root@VM-0-16-ubuntu:~# su ubuntu
ubuntu@VM-0-16-ubuntu:/root$

1.3 sudo:临时精准提权

su 切换到 root 后就拥有了全部最高权限,权限过大,操作风险很高。实际开发中更常用的是 sudo:只对单条命令临时提升 root 权限 ,执行完立刻回到普通用户身份。

典型场景

安装软件就是最典型的例子:软件需要安装到系统公共目录(如 /usr/bin),普通用户没有写入权限,但软件安装后所有用户都可以使用,只需要安装那一刻有 root 权限即可。

bash 复制代码
# 普通用户直接安装软件,权限不足报错
ubuntu@VM-0-16-ubuntu:~$ apt install gcc
# E: Could not open lock file ... Permission denied

# 加 sudo 临时提权,输入当前用户密码即可
ubuntu@VM-0-16-ubuntu:~$ sudo apt install gcc
# 输入当前用户密码,验证通过后以 root 权限执行安装

设计优势:

不用泄露 root 密码,普通用户输入自己的密码即可完成授权操作

权限最小化:只给单条命令提权,避免全程 root 带来的安全风险

可配置:系统管理员可以精确控制哪些用户能对哪些命令使用 sudo

注:Ubuntu 系统默认创建的第一个用户默认拥有 sudo 权限,其他用户需要 root 手动配置才能使用 sudo。

二、权限的本质与三类角色

2.1 权限是什么?为什么需要权限?

权限的本质 :规定「谁」对「某个目标」能不能做某件事。

为什么需要权限

1.约束用户行为,防止误操作破坏系统 :普通用户不能随便删系统文件、改内核配置,保证系统稳定。

2,实现多用户隔离 :一台服务器可以同时给多个用户使用,用户之间互不干扰、互不窥探。

我们常说「权限 = 角色 + 目标属性」:

角色:操作者的身份

目标属性:目标对象本身的权限标记

而 Linux 下「一切皆文件」,我们面对的所有操作对象本质都是文件,因此 Linux 的权限体系全部围绕文件权限展开。

2.2 三类角色:拥有者、所属组、其他

Linux 为每个文件都定义了三类角色,分别对应三套独立的权限:

角色 英文标识 含义
拥有者 User(u) 文件的创建者、所有者
所属组 Group(g) 文件归属的用户组,同组内的用户共享这套权限
其他用户 Other(o) 既不是拥有者、也不在所属组里的其他所有用户

2.3 为什么要有「所属组」?

如果只有「拥有者」和「其他人」两类,权限粒度太粗:要么是自己的完全控制,要么是所有人都一样的权限。

加入「所属组」后,可以实现精细化的团队协作:

一个项目组的成员都加入同一个用户组

项目文件设置为「同组可读可写、其他用户无权访问」

这样组内成员可以协作修改,组外人员无法访问,完美平衡了便利性和安全性

2.4 ls -l 权限位完整拆解

我们执行 ll(等价于 ls -l)时,第一列的 10 个字符就是文件的类型与权限位,我们逐位拆解:

目录文件示例

bash 复制代码
drwxrwxr-x  3 ubuntu ubuntu 4096 Jul 26 23:34 lesson4/
第 1 位 第 2-4 位 第 5-7 位 第 8-10 位 链接数 拥有者 所属组 大小 时间 文件名
d rwx rwx r-x 3 ubuntu ubuntu 4096 Jul 26 23:34 lesson4/
文件类型 拥有者权限 所属组权限 其他用户权限

普通文件示例

bash 复制代码
-rw-rw-r--  1 ubuntu ubuntu   27 Jul 26 18:09 log.c
第 1 位 第 2-4 位 第 5-7 位 第 8-10 位
- rw- rw- r--
普通文件 拥有者:读 + 写 所属组:读 + 写 其他用户:只读

每一组的三个位置固定对应 r w x,有该权限显示字母,没有则显示 -:

r(read):读权限

w(write):写权限

x(execute):执行权限

三、权限的修改与管理

3.1 普通文件的 rwx 含义

先从最容易理解的普通文件说起:

权限 普通文件中的含义
r 可以读取文件内容,比如 cat、less 查看
w 可以修改文件内容,比如写入、追加、清空
x 可以执行该文件(二进制程序、脚本等)

3.2 chmod:修改文件权限

chmod 全称 Change Mode ,用于修改文件的权限位。只有文件拥有者和 root 可以修改文件权限。

方式一:字符表示法(适合少量修改)

用 u/g/o/a 指定角色,用 +/-/= 表示增加、移除、设置权限,后跟 r/w/x。

标识 含义
u 拥有者 user
g 所属组 group
o 其他用户 other
a 全部三类 all
+ 增加权限
- 移除权限
= 精确设置权限

示例

bash 复制代码
# 给拥有者增加执行权限
chmod u+x log.c

# 给所属组移除写权限
chmod g-w log.c

# 给其他用户设置为只读
chmod o=r log.c

# 给所有用户增加执行权限
chmod a+x log.c

# 同时设置多个角色,逗号分隔
chmod u=rwx,g=rx,o=r log.c

方式二:八进制数字法(适合整体设置)

将每一组权限用三位二进制表示,r=4、w=2、x=1,求和后得到一个八进制数字,三组权限对应三个数字。

权限组合 二进制 八进制
rwx 111 7
rw- 110 6
r-x 101 5
r-- 100 4
--- 000 0

最常见的权限组合:

777 → rwxrwxrwx:所有人都有全部权限

755 → rwxr-xr-x:拥有者全权限,组和其他只读 + 执行(可执行程序常用)

644 → rw-r--r--:拥有者读写,其他人只读(普通文本文件常用)

600 → rw-------:只有拥有者自己能读写(私密文件、密钥文件常用)

示例

bash 复制代码
# 设置为所有人全权限
chmod 777 log.c

# 设置为拥有者读写,其他只读
chmod 644 log.c

# 目录递归设置权限(-R 递归所有子文件)
chmod -R 755 lesson4/

3.3 权限匹配规则:命中即停止

系统判断用户权限时,按 拥有者 → 所属组 → 其他用户 的顺序依次匹配:

先判断用户是不是文件的拥有者,如果是,直接使用拥有者权限,不再往下判断

如果不是拥有者,判断是否在所属组里,如果是,使用所属组权限

都不是,才使用 other 权限

⚠️ 重要:只匹配一次,命中就停止。 不会出现「拥有者没权限但组里有权限,所以能用组权限」的情况。

3.4 chown /chgrp:修改拥有者与所属组

chown:修改文件的拥有者(change owner)

chgrp:修改文件的所属组(change group)

为什么普通用户不能随便把文件「送人」?

系统默认不允许普通用户将自己的文件转让给其他用户。原因很简单:

如果可以随意转让文件所有权,恶意用户就可以把塞满病毒的文件改成 root 所有,或者把系统关键文件改成自己所有,存在巨大安全隐患。

因此普通用户执行 chown 会直接报错,必须提升到 root 权限才能修改。

示例:

bash 复制代码
# 普通用户修改文件拥有者,直接报错
ubuntu@VM-0-16-ubuntu:~$ chown root log.c
# chown: changing ownership of 'log.c': Operation not permitted

# 加 sudo 提权后可以修改
ubuntu@VM-0-16-ubuntu:~$ sudo chown root log.c

# 修改所属组
sudo chgrp root log.c

# 同时修改拥有者和所属组(冒号分隔)
sudo chown root:root log.c

3.5 核心认知:root 不受权限约束

root 是超级管理员,权限系统对 root 完全不生效:

任何文件,哪怕权限是 000(所有人都没权限),root 照样可以读写执行

任何目录,哪怕没有 x 权限,root 照样可以进入

任何文件,root 都可以随意修改拥有者、权限位

这也是为什么 root 权限极高、日常不推荐使用的原因:没有权限保护,误操作会直接摧毁系统。

3.6 澄清:可执行权限 ≠ 文件一定能运行

很多初学者会混淆:给文件加了 x 权限,是不是就变成可执行程序了?

不是。

x 权限只是「许可」: 允许你去尝试执行这个文件

文件本身的内容才是「能力」 :只有它本身是可执行的二进制程序、或者带解释器声明的脚本,才能真正运行

举个例子:给一个普通的 txt 文本文件加 x 权限,你有权限执行它,但它本身不是可执行程序,执行依然会报错。

一句话总结:有 x 权限不一定能执行,没 x 权限肯定不能执行。

四、三大核心权限问题深度解析

4.1 问题一:目录的 rwx 分别代表什么?

很多人会把文件的 rwx 直接套到目录上,这是错误的。目录的 rwx 含义和普通文件完全不同,也是面试高频考点。

逐个拆解

权限 在目录中的含义
r(读) 可以查看目录内的文件列表,也就是能执行 ls 看到里面有哪些文件
w(写) 可以在目录内新建、删除、重命名文件 / 子目录
x(执行) 可以进入该目录,也就是能执行 cd 进入,也能访问目录内文件的详情

三个关键结论

1.想进入一个目录,必须要有 x 权限 。这是目录最基础的权限,没有 x 连目录都进不去,其他权限都无从谈起。

2.只有 r 没有 x:能看到文件名列表,但看不到文件的详情(大小、权限等),也打不开文件。

3.只有 x 没有 r:能进入目录,但看不到里面有什么文件,必须知道确切的文件名才能访问。

实用结论:正常使用的目录,rwx 三个权限一般都要有,缺一不可。

实操验证(普通用户视角)

bash 复制代码
# 1. 创建测试目录和文件
mkdir test_dir
touch test_dir/a.txt

# 2. 去掉目录的 x 权限
chmod u-x test_dir

# 尝试进入目录 → 失败
cd test_dir
# bash: cd: test_dir: Permission denied

# 尝试 ls 查看 → 能看到文件名但看不到详情
ls test_dir
# ls: cannot access 'test_dir/a.txt': Permission denied
# a.txt

# 3. 恢复 x,去掉 r 权限
chmod u+x,u-r test_dir
cd test_dir  # 可以进入
ls           # 看不到里面有什么文件
# ls: cannot open directory '.': Permission denied

# 4. root 不受限制:哪怕权限全关,root 照样操作
sudo chmod 000 test_dir
sudo ls test_dir  # root 正常查看
sudo cd test_dir  # root 正常进入

延伸:多用户是怎么互相隔离的?

每个用户的家目录(比如 /home/ubuntu)默认权限通常是 750 或 700,其他用户没有 x 权限,因此普通用户无法进入其他用户的家目录,自然也就看不到、修改不了别人的文件,实现了用户级别的隔离。

4.2 问题二:文件的默认权限从哪来?umask 权限掩码

我们每次新建文件、新建目录,系统都会自动分配一组默认权限。这个默认权限不是凭空来的,由「起始权限」和「权限掩码 umask」共同决定。

第一步:起始权限

Linux 规定了两类文件的起始基础权限:

普通文件 :起始权限为 666(rw-rw-rw-),默认不带执行权限。因为可执行是高风险权限,系统默认不自动给。

目录文件 :起始权限为 777(rwxrwxrwx),默认带 x 权限。因为目录的 x 是基础功能,没有就没法用。

第二步:umask 权限掩码

umask 叫做权限掩码 ,作用是:凡是 umask 中出现的权限位,最终权限中都要去掉。

计算公式:

bash 复制代码
最终权限 = 起始权限 & (~umask)

也就是「起始权限」按位与「umask 取反」,本质就是去掉 umask 中指定的权限位。

⚠️ 注意:不是简单的减法,是位运算。虽然偶数位减法和位运算结果一致,但概念上完全不同。

实操验证

Ubuntu 系统默认 umask 一般是 0002,其中第一位是特殊权限位,我们关注后三位 002 即可:

bash 复制代码
# 查看当前 umask 值
umask
# 输出:0002

我们计算一下:

umask 后三位 002 → -------w-

~umask → rwxrwxr-x

普通文件最终权限:

666(rw-rw-rw-) & ~002 = rw-rw-r-- → 也就是 664

目录最终权限:

777(rwxrwxrwx) & ~002 = rwxrwxr-x → 也就是 775

我们新建文件验证:

bash 复制代码
# 新建普通文件,查看权限
touch test.txt
ll test.txt
# -rw-rw-r-- 1 ubuntu ubuntu 0 Jul 28 10:08 test.txt → 正好是 664

# 新建目录,查看权限
mkdir test_dir
ll -d test_dir
# drwxrwxr-x 2 ubuntu ubuntu 4096 Jul 28 10:08 test_dir → 正好是 775

为什么需要 umask?

系统的起始权限是固定的,但不同场景对安全等级的要求不同:

个人开发环境:权限松一点,umask 设 002,同组用户可以协作

高安全服务器:权限严一点,umask 设 077,新建文件只有自己能读写,组和其他用户全无权限

umask 是可配置的,让系统可以灵活控制默认权限,保证所有新建文件的权限都符合安全规范,不用每个文件创建后再手动修改。

4.3 问题三:文件能不能被删除,谁说了算?

这是最反常识的一个知识点,也是面试高频题。

结论先抛出来

一个文件能否被删除,和文件本身的权限无关,只和它所在目录的 w 权限有关!

为什么?

删除文件,本质上不是修改文件本身,而是修改目录中的目录项 ------ 把这个文件名从目录的列表里去掉。既然是修改目录的内容,那自然需要目录的 w 权限。

举个极端例子:

你在公共目录里放了一个文件,权限设为 444(所有人只读,谁都不能改)

但别人对这个公共目录有 w 权限,那他照样可以直接删掉这个文件

反过来:如果目录没有 w 权限,哪怕文件是你自己的、权限全开,你也删不了它

共享目录的安全痛点

多人协作的共享目录,大家都需要 w 权限来新建文件。但有了 w 权限,就意味着任何人都能删掉别人的文件,这显然不合理。

Linux 为此专门设计了一个特殊权限位:粘滞位(Sticky Bit)。

粘滞位:保护共享目录的文件

作用对象:只能给目录设置,给普通文件设置没有意义

效果:设置了粘滞位的目录,里面的文件只有文件拥有者、目录拥有者和 root 才能删除 ;其他用户哪怕有目录的 w 权限,也只能删自己的文件,删不了别人的。

设置方法:chmod +t 目录名

标识:设置后,other 位的 x 会变成 t,比如 drwxrwxrwt

实操示例

bash 复制代码
# 1. root 创建公共共享目录,权限 777
sudo mkdir /public_shared
sudo chmod 777 /public_shared

# 2. 用户 A 在里面创建文件
# userA@server:~$ touch /public_shared/a_file

# 3. 用户 B 可以随便删掉 A 的文件(没设粘滞位时)
# userB@server:~$ rm /public_shared/a_file  # 成功删除

# 4. 设置粘滞位
sudo chmod +t /public_shared
ll -d /public_shared
# drwxrwxrwt 2 root root 4096 Jul 28 10:20 /public_shared

# 5. 再试:用户 B 无法删除用户 A 的文件
# userB@server:~$ rm /public_shared/a_file
# rm: cannot remove 'a_file': Operation not permitted

最佳实践:多人共享的公共目录,一定要设置粘滞位。系统自带的 /tmp 目录就是典型的粘滞位目录,所有人都能在里面建文件,但只能删自己的。

五、本章总结 & 下篇预告

本章核心要点回顾

用户身份:Linux 分 root 超级用户和普通用户;su 切换身份,sudo 临时单条命令提权,更安全。

三类角色:每个文件都有拥有者、所属组、其他用户三套独立权限,实现精细化权限控制。

权限修改:chmod 支持字符法和八进制数字法;chown/chgrp 修改归属,普通用户无权操作,需要 root 权限。

目录权限:r 看列表、w 增删文件、x 进入目录;进入目录必须有 x 权限。

默认权限:由起始权限(文件 666、目录 777)按位与 umask 取反得到,umask 控制默认安全等级。

文件删除:由所在目录的 w 权限决定,和文件本身权限无关;共享目录设置粘滞位防止误删他人文件。

root 特性:root 用户不受任何权限约束,拥有系统最高权力。

相关推荐
砍材农夫1 小时前
运维|devops|jenkins构建分支选择及执行日志展示
运维·jenkins·devops
肥胖小羊1 小时前
企业微信自建应用多环境联调与路由代理方案
服务器·前端·网络
Alan_6912 小时前
第三方API对接的通用封装模式
服务器·开发语言·php
buhuizhiyuci2 小时前
【Linux 篇】数字世界的通信管道 —— 匿名管道与进程池深度实战解析
linux·运维·服务器
十六年开源服务商2 小时前
WordPress邮件日志记录定制开发指南2026
运维·开源
无锡耐特森2 小时前
ModbusTCP转Profinet:打通潜油电泵工业互联新路径
linux·运维·服务器
晨陌y2 小时前
多台服务器怎么统一监控?哪吒面板部署、钉钉告警与远程访问教程
运维·服务器·钉钉
阿标在干嘛3 小时前
政策快报平台日志系统的3次演进:从文件到ELK到告警
运维·elk·jenkins
味悲3 小时前
Apache HTTP 服务器配置
服务器·http·apache