跳到主要内容Linux 权限管理指南:从 Shell 命令到文件访问控制 | 极客日志Shell / Bash
Linux 权限管理指南:从 Shell 命令到文件访问控制
综述由AI生成Linux 权限管理的核心内容,涵盖 Shell 命令原理、用户体系划分、文件访问主体定义及权限表示方法。重点介绍了 chmod、chown、chgrp 等权限修改命令的使用,以及 umask 权限掩码对新建文件默认权限的影响。此外,还详细阐述了目录权限的特殊性、共享文件场景下的权限冲突解决方案,以及粘滞位在防止恶意删除共享文件中的应用。
深海蔚蓝25 浏览 Shell 命令及运行原理
Shell 概述
严格来说,Linux 的核心是内核(kernel),但普通用户无法直接与内核交互。Shell 是内核的 '外壳' 程序,作为命令行解释器(command Interpreter),它主要承担两大任务:
将用户输入的命令翻译给内核处理;
把内核的处理结果再翻译回给用户;

类比 Windows 系统,我们操作 Windows 并非直接与内核交互,而是通过图形界面。在 Linux 中,Shell 有着相同的作用,它解析我们的指令并传递给内核,再将内核运行的结果解析后反馈给用户。
shell 与 bash/sh 的关系:
概念范畴: shell 是对'命令行解释器'的统称,不特指某一款工具。
具体实现: sh(Bourne Shell)和 bash(Bourne-Again Shell)都是 shell 的具体类型。
核心关联: sh 是最早的经典 shell 标准;bash 是 sh 的增强版,完全兼容 sh 的语法,同时新增了更多实用功能,是目前最主流的 shell。
日常称呼: 无论实际使用的是 bash、sh 还是其他 shell,日常交流中都可以统称为'shell'。
Shell 命令本质
指令的本质,是编译好的程序或脚本,它们会存放在系统的特定路径下。输入指令的过程,本质就是输入字符串。比如在 bash 命令行中,我们输入 ls 这样的命令,其实就是输入了一串字符,而这串字符对应着系统中特定的程序或脚本。
Shell 作用
- 进行命令行的解释
- 保护 OS,对于用户的非法请求,直接拦截
Linux 用户体系
Linux 下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以在 linux 系统下做任何事情,不受权限约束
- 普通用户:在 linux 下做有限的事情,受权限约束
- 命令提示符:其中超级用户的命令行提示符是'#',普通用户的命令行提示符是'$'
用户切换与提权
su 命令
语法: su [用户名]
功能: 切换用户身份(获取目标用户的权限),但保留原用户核心环境变量(仅工作目录切换到目标用户家目录)
事项:
- root 用户切换普通用户:
su [普通用户] 无需密码,切换后获得目标普通用户的权限,工作目录到其家目录,但核心环境变量保留 root 配置。
- 普通用户切换 root 用户:
su 或 su root 需输入 root 密码,切换后获得 root 的最高权限,工作目录到 /root,但核心环境变量保留原普通用户配置。
- 普通用户切换普通用户:
su [普通用户] 需输入目标用户密码,切换后获得该普通用户的权限,工作目录到其家目录,核心环境变量保留原用户配置。
su - 命令
语法:
su - [用户名]
功能: 切换用户身份(获取目标用户的权限),并加载其完整环境(环境变量、工作目录等,完全模拟目标用户登录)
- root 用户切换普通用户:
su - [普通用户] 无需密码,切换后获得目标普通用户的权限,进入其家目录,加载其完整环境变量。
- 普通用户切换 root 用户:
su - 或 su - root 需输入 root 密码,切换后获得 root 的最高权限,进入 /root 目录,加载 root 的完整环境变量。
- 普通用户切换普通用户:
su - [普通用户] 需输入目标用户密码,切换后获得该普通用户的权限,进入其家目录,加载其完整环境变量。
上述指令本质上都属于 su 命令的范畴,其中 - 是 su 命令的一个功能性选项。
在 Linux 环境中,exit 命令或者按下 Ctrl + D 组合键,主要作用是退出当前的用户会话,可以理解为 '返回' 到上一级操作环境或者退出登录状态。
sudo 指令
功能: 普通用户临时获取高权限执行特权操作,无需切换到 root 账号
- 密码验证: 输入当前普通用户的密码(而非 root 密码),验证通过后临时提权执行命令
- 安全与效率: 减少切换 root 的操作成本,同时通过授权机制提升安全性
- 使用前提: 默认仅 root 能直接用 sudo;普通用户需由超级管理员在
/etc/sudoers 文件中配置授权(列入可使用 sudo 的白名单)
文件访问主体
- 所有者(User, u):相当于文件 / 目录的'创建者、拥有者',对其有最直接的权限管理能力。
- 所属组(Group, g):指与所有者同属一个用户组的成员,可共享部分针对该文件 / 目录的权限。
- 其它用户(Others, o):既不是所有者,也不属于所有者所在组的用户,对该文件 / 目录的权限受严格限制。
root 用户和普通用户,都能当上面说的所有者、所属组用户或者其他用户里的任意一种。
文件类型
- 目录文件(d):即文件夹,用于存放文件和子目录的特殊文件。
- 普通文件(-):文本、可执行程序、库等基本都属于普通文件。
- 软链接文件(l):类似 Windows 的快捷方式。
- 块设备文件(b):例如硬盘、光驱等设备文件。
- 管道文件(p):用来进行进程间通信的文件。
- 字符设备文件(c):例如屏幕等串口设备文件。
- 套接口文件(s):主要用于网络通信,也可用于同一台主机上不同进程间的通信。
【文件属性】:

【文件名后缀】:
在 Linux 系统下,文件名后缀没有直接意义,不代表不用。比如 gcc 编译器会通过后缀来判断文件是否是它能处理的类型(如 .c 为 C 源文件)。所以虽然系统不强制,但为了让这些软件能正常工作,实际使用中还是会用符合软件预期的后缀。
文件权限管理
什么是权限?
权限是指是否允许主体(如用户)对对象(如文件)执行特定操作的规则,和主体身份、对象属性都有关。当然权限并不能限制 root 用户,root 用户拥有最高权限。
基本权限
- 读权限(r):对文件而言,可读取文件内容;对目录来说,能浏览该目录下的文件和子目录信息。
- 写权限(w):对文件而言,可修改文件内容;对目录来说,可在目录内创建、删除或移动文件。
- 执行权限(x):对文件而言,可将文件作为程序运行;对目录来说,可使用
cd 命令进入该目录。
- 无权限表示:'-' 表示不具有对应的读、写或执行权限。
文件权限值表示方法
| 权限 | 说明 |
|---|
r-- | 只读 |
-w- | 仅可写 |
--x | 仅可执行 |
rw- | 可读可写 |
-wx | 可写和可执行 |
r-x | 可读可执行 |
rwx | 可读可写可执行 |
--- | 无权限 |
| 权限 | 八进制 | 二进制 |
|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
rw | 6 | 110 |
rx | 5 | 101 |
wx | 3 | 011 |
rwx | 7 | 111 |
--- | 0 | 000 |
二进制中三位分别对应读、写、执行权限,1 代表有对应权限、0 代表无对应权限;八进制中每一位分别对应所有者、所属组、其他用户这三个身份。
【示例】:

权限修改
chmod 命令(设置文件/目录权限)
说明: 只有文件的拥有者和 root 才可以改变文件的权限。
+:向权限范围增加权限代号所表示的权限。
-:向权限范围取消权限代号所表示的权限。
=:向权限范围赋予权限代号所表示的权限。
u:拥有者。
g:拥有者同组用户。
o:其它用户。
a:所有用户。
将 test.c 文件的所有者、所属组、其他用户权限都设为可读、可写、可执行。
把 test.txt 文件的所有者、所属组、其他用户权限都设为可读、可写、可执行。
chown 指令(修改文件/目录的拥有者)
说明: 普通用户不能将文件随便给别人,一般通过 sudo 提权强制给别人文件。
演示:
普通用户不能将文件随便给别人:

root 可以强制给:

chgrp 指令(修改文件/目录的所属组)
说明: 只有文件的所有者、root 才可以改变文件的所属组(普通用户需通过 sudo 提权后操作)。
演示:
root 将 div 文件的所属组给了 zyj

权限使用案例
【案例 1】:root 不受任何权限约束
对于 div 目录 root 属于其他人,其他人没任何权限,但是 root 可以进去 div 目录,代表他无视了执行权限的约束。

【案例 2】:文件的拥有者没有读写执行权限
在权限判断时,系统会优先检查是否为文件所有者,再依次判断所属组和其他用户;即便用户同时是所有者和所属组成员,也仅以所有者权限为准。若所有者自身没有读写执行权限,那么即便身为所有者,也无法对文件执行对应操作。

文件起始权限问题
默认给普通文件的起始权限是 666,目录文件的起始权限是 777。
但从实际情况得知,新创建的普通文件和目录文件相对应的权限分别是 664、775。
这里大家就会疑惑为啥不一样,这个时候就引进了权限掩码这个概念。
权限掩码和 umask 命令
功能: 查看或修改文件权限掩码,影响新建文件和目录的默认权限。
说明: 将默认的存取权限减去 umask 设定的权限掩码后,得到文件或目录的预设权限。超级用户(root)默认掩码值为 0022(8 进制),普通用户默认为 0002(8 进制)。
新建文件默认最大权限为 0666,新建目录默认最大权限为 0777。但实际创建的文件和目录权限并非上述值,因为会受到 umask 影响。假设默认最大权限为 mask,则实际创建的文件权限为:mask & (~umask)(& 为按位与运算,~ 为按位取反运算)。
umask // 查看
umask 044 // 设置
【计算示例】:

实际默认权限计算演示
普通用户默认 umask 是 0002(八进制),转换为二进制为 000 000 010。对该二进制进行按位取反操作,得到 111 111 101。
实际创建文件或目录时,会将文件默认最大权限(文件为 0666,目录为 0777)与取反后的 umask 值进行按位与运算,最终得到的结果就是新创建文件或目录的实际权限。比如对于目录,0777(二进制 111 111 111)和 111 111 101 按位与,结果为 111 111 101,即八进制 775,这就是普通用户新建目录的实际默认权限。
从图中圈出的二进制位变化可以清晰看到,umask 二进制中为 1 的对应位置,会使得默认最大权限(文件 666 对应二进制 110 110 110、目录 777 对应二进制 111 111 111)在这些位置的权限被'删除'。
【问题】:如何通过修改默认权限掩码,让新创建的目录文件只有执行权限
那就是要去掉三种权限的前两个位置的权限,对应的二进制掩码是 110,八进制就是 6,删除 3 种身份的所有读写权限的八进制掩码就是 0666
目录权限
上面基本都是基于普通文件的权限进行介绍的,接下来讲解下目录文件的权限问题。
我们从这个新创建的 div 文件进行探讨,刚开始的权限的 111 111 101。
1、去掉读权限
图中观察得知,没有查看 div 目录下文件的权限了,但是可以进入这个目录。
3、去掉可执行权限
不能进入目录。
Linux 目录权限中,可执行权限(x) 决定能否在目录下执行命令、进入目录(cd);若没有 x 权限,即便有读权限(r),也无法进入目录及执行相关操作。而若只有 x 权限但无 r 权限,虽能进入目录、执行命令(如 cd),但因缺乏读权限,无法读取目录下文件(如执行 ls 也无法列出文件)。
共享文件问题
由于普通用户自己的家目录权限是 700,所以我在我的家目录下创建的文件,别人都看不到。
因此,我们所创建的共享文件,不能再任何一个人的家目录下。
那么我们想建立一个多用户共享的文件到底该在哪里创建呢?
我们可以在根目录下用 root 账号创建一个文件,并将所有权限打开,这样别的用户就可以进行任何操作了。
我用第一个用户创建了一个文件,第二个用户也能看到。
我用 zyj 用户给文件写了点东西,因为 ljh 用户有读的权限,所以也能查看文件内容。
zyj 关掉了 ljh 的读权限,ljh 读不了文件了。
ljh 一气之下删掉了那个文件,是不是感觉有点奇怪,但是确实可以,因为共享目录的 w 权限其他人也拥有,自然也能删除该目录的子文件,那么我们该如何解决恶意删除问题呢?
有些人可能想去掉共享文件其他人的 w 权限,但是这样就不能创建文件了,那么共享文件自然就没有意义了,所以接下来将引入一个新的名词粘滞位。
粘滞位
当一个目录被设置为'粘滞位'(用 chmod +t),则该目录下的文件只能由
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online