Linux提权基础
Linux 用户和用户组
用户和用户组的概念:
在 Linux 系统中,用户(User) 和用户组(Group) 是实现 “多用户权限管理” 的核心机制,目的是隔离不同操作者的资源访问范围,保证系统安全和有序运行。简单来说,用户是 “操作的执行者”,用户组是 “用户的集合”,两者配合实现精细化的权限控制。
这两者的关系属于多对多,如图用户jimmy可以加入用户组A,C。而用户组也可以拥有多个用户,如用户C存在用户jimmy,tom
其实这里的用户和用户组与Shiro中的角色和用户很像本质是为了高效管理用户权限。用户组:具有相同特性用户,可以高效的管理用户权限.

groups:查看当前用户所有的组
groupadd:添加一个组
cat /etc/group:查看当前有哪些组
groupdel:删除某个组


useradd:向组中添加用户
useradd -m -G root,grouptest1 testuser1
-m 参数会在home目录自动创建当前用户的文件夹
-G 可以指定多个组添加

uid:User ID(用户 ID),是系统识别用户的 “数字身份证”(用户名只是给人看的)。用户唯一标识
[0]:超级用户,linux系统默认都自动将root创建为超级用户;
[1-999]:虚拟用户,系统保留的uid范围值(不同的版本,可能有不同的范围,如RHEL8中这个范围是1-999)负责某些服务程序的 启动和运行,一般不需要登陆;
[1000-n]:普通用户,当我们创建第一个普通用户时uid默认从1000开始。
gid=1003:主组唯一标识,这里特指用户的 “主组”—— 用户创建文件 / 目录时,默认归这个组所有groups:所有所属组,列出用户加入的所有组,包括 “主组” 和 “附加组”
newgrp:切换主组

查看每个文件的权限。


1. File Type(文件类型)
最左侧第一个字符,标识文件的类型:
-:表示普通文件(如文本、二进制程序等)。d:表示目录(文件夹)。- 其他常见类型还有
l(符号链接,类似快捷方式)、c(字符设备,如终端)、b(块设备,如硬盘)等。
2. Owner(所有者权限)
接下来的 3 个字符,控制文件所有者(创建该文件的用户)的访问权限:
r(Read):读权限—— 允许查看文件内容(若为目录,可列出目录内的文件)。w(Write):写权限—— 允许修改文件内容(若为目录,可在目录内创建 / 删除文件)。x(Execute):执行权限—— 允许运行文件(若为程序 / 脚本);若为目录,允许cd进入该目录。
3. Group(所属组权限)
中间的 3 个字符,控制文件所属用户组(与所有者同组的用户)的访问权限,权限含义与 “Owner” 部分一致(r读、w写、x执行)。
4.Other Users(其他用户权限)
最右侧的 3 个字符,控制既非所有者、也非所属组的 “其他所有用户” 的访问权限,权限含义同样为r读、w写、x执行。
修改权限命令:chmod
chmod [选项] 权限设置 文件名/目录名
1.用 3 位数字(0-7)分别对应 u、g、o 的权限,数字由 r(4)、w(2)、x(1) 相加得出。
# 所有者可读/写/执行,所属组可读/执行,其他用户只读
chmod 754 file.txt# 所有用户可读/写/执行(危险!谨慎使用)
chmod 777 data/# 递归修改目录及子文件:所有者读写,组和其他只读
chmod -R 644 docs/
2.通过符号组合 [用户] [操作符] [权限] 来修改,适合 “微调” 权限。
- 用户:
u(所有者)、g(组)、o(其他)、a(所有) - 操作符:
+(添加权限)、-(移除权限)、=(设置为指定权限,覆盖原有) - 权限:
r、w、x
# 给所有者添加执行权限
chmod u+x script.sh# 移除其他用户的写权限
chmod o-w shared.txt# 给所属组设置“读+写”权限(覆盖原有组权限)
chmod g=rw config.ini# 给所有用户添加读权限
chmod a+r report.pdf# 递归给目录的所有用户添加执行权限(允许进入目录)
chmod -R a+x projects/
Linux服务与进程管理
进程
- 定义:进程是正在运行的程序,系统会为其分配内存、CPU 等资源,每个进程有唯一的
PID(进程 ID)。
例:执行ls命令时,Linux 会生成一个ls进程,执行完后进程自动终止。
2.核心特点
- 资源独立:每个进程占用独立资源,互不干扰。
- 分两类:
- 前台进程:依赖终端(如终端里的
python交互模式),关终端则进程停。 - 后台进程:不依赖终端(如
nohup python script.py &),关终端仍运行。
- 前台进程:依赖终端(如终端里的
3.常用查看命令
ps aux # 看所有进程(含PID、占用资源)
top # 动态监控进程(实时刷新)
前台进程与后台进程
在 Linux 终端中,进程分为前台进程(占据终端,可直接交互)和后台进程(不占用终端,默默运行)。掌握它们的管理命令,能大幅提升终端操作效率。以下是实用命令及示例,适合直接套用。
一、前台进程:直接交互的 “当前任务”
前台进程会占据终端的输入输出,用户可通过键盘直接控制(如输入、终止)。
- 启动前台进程(默认方式)
直接执行命令,进程即运行在前台:
# 例1:运行一个Python脚本(前台,终端会显示脚本输出)
python3 test.py# 例2:启动一个交互式程序(如Python解释器,前台可输入代码)
python3
特点:终端会被占用,此时无法输入其他命令,直到进程结束(或被终止)。
2. 终止前台进程
按 Ctrl + C 发送终止信号,强制结束当前前台进程:
# 假设正在前台运行python3 test.py,按Ctrl+C后:
^C # 终端显示此符号,进程被终止
二、后台进程:不占终端的 “并行任务”
后台进程在终端后台运行,不影响用户继续输入其他命令,适合耗时任务(如下载、批量处理)。
1. 直接启动后台进程(加&)
命令后加 &,进程会直接在后台运行,并返回进程 ID(PID) 和作业号(如[1]):
# 例1:后台运行Python脚本(终端立即返回,可继续输入其他命令)
python3 test.py &
[1] 12345 # [1]是作业号,12345是PID# 例2:后台运行文件下载(wget下载时不占用终端)
wget https://example.com/file.zip &
[2] 12346
2. 将前台进程 “暂停并移到后台”
若前台进程已启动(占用终端),可先暂停再移到后台:
- 按
Ctrl + Z暂停前台进程(终端显示暂停信息); - 用
bg [作业号]将暂停的进程移到后台继续运行(作业号可通过jobs查看)。
# 步骤1:前台运行脚本,按Ctrl+Z暂停
python3 test.py
^Z # 按Ctrl+Z
[1]+ 已停止 python3 test.py# 步骤2:用bg将暂停的进程移到后台(默认操作最后一个暂停的进程,可加作业号指定)
bg
[1]+ python3 test.py & # 进程在后台恢复运行
3. 查看后台进程(作业)
用 jobs 命令查看当前终端的所有后台作业,显示作业号、状态、命令:
jobs
[1]- 运行中 python3 test.py &
[2]+ 运行中 wget https://example.com/file.zip &
+表示 “当前默认作业”(fg/bg不加参数时操作此作业);-表示 “次默认作业”。
4.将后台进程 “调回前台”
用 fg [作业号] 将后台进程移到前台(需终端交互时用):
# 将作业号1的后台进程调回前台
fg %1
python3 test.py # 终端被占用,进程回到前台
5.终止后台进程
有两种方式(推荐用作业号,更直观):
- 通过作业号:
kill %作业号 - 通过PID:
kill PID(PID 可通过jobs -l或ps aux查看)
# 例1:通过作业号终止(终止作业1)
kill %1
[1]+ 已终止 python3 test.py# 例2:通过PID终止(先查PID,再kill)
jobs -l # 查看作业的PID(第二列是PID)
[2]+ 12346 运行中 wget https://example.com/file.zip &
kill 12346 # 终止PID=12346的进程
6.后台进程 “防终端关闭终止”(nohup)
默认情况下,关闭终端会终止后台进程。用 nohup 可让进程忽略终端关闭信号,持续运行:
# 后台运行脚本,输出重定向到nohup.out(避免终端关闭后终止)
nohup python3 test.py &
nohup: 忽略输入并把输出追加到'nohup.out' # 提示输出位置
三、命令速查表
| 操作需求 | 命令示例 |
|---|---|
| 启动前台进程 | python3 test.py |
| 启动后台进程 | python3 test.py & |
| 暂停前台进程并移到后台 | Ctrl + Z → bg |
| 查看后台作业 | jobs |
| 后台进程调回前台 | fg %1(%1 是作业号) |
| 终止后台进程(作业号) | kill %1 |
| 后台进程防终端关闭 | nohup 命令 & |
进程相关命令
1.ps [查看进程]
ps(Process Status)用于查看系统中进程的静态快照,适合快速获取进程的 PID、状态、所属用户等信息。
常用参数与示例
-
查看当前终端的进程:
ps输出简洁,仅显示当前终端中运行的进程。
-
查看系统所有进程(最常用):
ps auxa:显示所有用户的进程;u:以 “用户友好格式” 显示(含 CPU、内存占用等详情);x:显示无终端的进程(如后台服务进程)。
-
筛选特定进程:
结合
grep过滤进程名,例如查看nginx相关进程:ps aux | grep nginx
2.pstree [查看进程树]
pstree 用于以树状结构显示进程间的父子关系,直观展示 “进程由哪个父进程创建” 的衍生层级。
常用示例:
-
显示所有进程的树状结构:
pstree输出类似
systemd─┬─...,清晰体现进程的 “父子传承”。 -
显示指定进程的树状结构(如查看
ssh相关进程树):pstree -p $(pgrep ssh)-p:显示进程 PID,方便精准定位具体进程。
3.top [实时进程动态]
top 用于实时监控进程的资源占用,界面会持续刷新(默认每 3 秒),适合观察 CPU、内存等资源的动态变化。
核心交互操作
-
直接执行进入监控界面:
top界面会显示系统整体负载(如 CPU 使用率、内存占用)、进程列表(默认按 CPU 占用排序)等。
-
常用交互按键:
P:按 CPU 占用排序;M:按内存占用排序;k:输入 PID 后,向指定进程发送终止信号;q:退出top。
4.kill [终止进程]
kill 用于向进程发送信号,从而控制进程(最常用场景是 “终止进程”,默认发送 SIGTERM 信号)。
常用示例
-
终止指定 PID 的进程(如 PID 为
1234的进程):kill 1234若进程无法 “优雅终止”,可发送强制终止信号(
SIGKILL,编号9):kill -9 1234 -
通过进程名终止(结合
pkill更便捷):例如终止所有
firefox进程:pkill firefox
5.lsof [端口占用查看进程]
lsof(List Open Files)用于查看系统中被进程打开的文件和网络连接,常用来定位 “哪个进程占用了特定端口”。
常用示例
-
查看 80 端口被哪个进程占用:
lsof -i:80输出会显示占用 80 端口的进程 PID、用户、程序名等。
-
查看指定进程打开的文件(如 PID 为
5678的进程):lsof -p 5678
服务
1.定义:服务是长期在后台运行、提供系统功能的特殊进程,通常开机自动启动,用专门工具管理。
2. 核心特点
- 后台常驻:无终端界面,默默提供功能。
- 开机自启:默认随系统启动(可手动关闭)。
- 工具管理:用
systemctl操作(而非直接执行程序)。
systemctl [管理服务]
systemctl 是 systemd 系统的核心工具,用于管理系统服务的生命周期和自启动规则。
常用命令示例
-
查看服务状态(以
firewalld防火墙服务为例):systemctl status firewalld输出会显示服务是否运行、最近日志、进程 PID 等信息。
-
启动 / 停止服务:
systemctl start firewalld # 启动服务 systemctl stop firewalld # 停止服务 -
重启 / 重新加载服务:
systemctl restart firewalld # 完全重启(先停再启) systemctl reload firewalld # 平滑重载(不中断服务,仅刷新配置) -
设置开机自启 / 禁用自启:
systemctl enable firewalld # 开机自动启动 systemctl disable firewalld # 开机不自动启动 -
查看所有服务状态:
systemctl list-units --type=service
特殊文件
/etc/passwd
听到 “passwd”,你可能会以为它存着密码 —— 早年的 Linux 确实这么设计!但后来大家发现:这个文件需要让所有用户可读(比如普通用户要通过它判断 “自己的用户名是否存在”),如果直接存明文密码,风险太高了。于是后来密码被移到了更安全的/etc/shadow,但 “passwd” 这个名字一直沿用至今
用cat /etc/passwd命令打开文件,会看到每一行对应一个用户,格式特别规整,用冒号(:) 分成 7 个字段,比如这行典型的普通用户记录:
zhangsan:x:1001:1001:Zhang San,,,:/home/zhangsan:/bin/bash
| 字段位置 | 内容示例 | 含义解释 |
|---|---|---|
| 1 | zhangsan | 用户名(Username):登录时输入的 “身份标识”,比如 root、你的自定义用户名 |
| 2 | x | 密码占位符:早年存明文密码,现在固定用x代替,真正密码存在/etc/shadow |
| 3 | 1001 | UID(用户 ID):系统识别用户的 “数字身份证”,0=root,1-999 = 系统用户,1000 + 普通用户 |
| 4 | 1001 | GID(组 ID):用户默认所属组的 ID,对应/etc/group里的组信息 |
| 5 | Zhang San,,, | 注释信息(GECOS):可选字段,一般存用户全称、电话、邮箱等备注,逗号分隔 |
| 6 | /home/zhangsan | 家目录(Home Directory):用户登录后默认进入的目录,root 的家目录是/root |
| 7 | /bin/bash | 登录 Shell:用户登录后使用的命令行解释器,/bin/false或/sbin/nologin表示 “禁止登录” |
关键权限:为什么所有人都能读?
用ls -l /etc/passwd看权限,通常是这样的:
-rw-r--r-- 1 root root 1523 Oct 10 14:30 /etc/passwd
- 所有者(root):可读可写(rw-)
- 组用户(root 组):只读(r--)
- 其他用户(所有人):只读(r--)
之所以开放 “所有人可读”,是因为很多系统操作需要依赖它 —— 比如你用ls -l查看文件时,系统要通过passwd里的 “UID→用户名” 映射,把数字 UID 显示成你能看懂的用户名(比如把 1001 显示成 zhangsan)。如果普通用户读不了这个文件,很多命令都会 “乱码”
/etc/shadow
既然/etc/passwd只存 “花名册”,那真正的密码藏在哪儿?答案就是/etc/shadow—— 它是 Linux 系统的 “核心密码库”,专门存储用户的加密密码和密码策略,安全性极高,只有 root 能读写,普通人连看都看不了。
1. 为什么需要单独的 “密码本”?
早年把密码存在/etc/passwd时,一旦文件泄露,所有用户的明文密码都会被窃取。后来 Linux 引入了shadow机制:
- 把密码从 “公开花名册” 移到 “私密密码本”
- 密码存储时会经过单向加密(比如 SHA-512 算法),即使
shadow文件泄露,黑客也很难反推出明文密码 - 增加了 “密码过期时间”“锁定策略” 等功能,进一步提升安全
2. 打开看看:/etc/shadow的结构更复杂
因为权限严格,必须用sudo cat /etc/shadow才能打开,每一行对应一个用户,用冒号分成 9 个字段,比如:
zhangsan:$6$xyz123$abc456...:19500:0:99999:7:::
这 9 个字段全是 “密码相关的关键信息”,重点看前 5 个核心字段:
| 字段位置 | 内容示例 | 含义解释 |
|---|---|---|
| 1 | zhangsan | 用户名:和passwd里的用户名一一对应,关联身份 |
| 2 | 6xyz123$abc456... | 加密密码:最核心的字段,格式是$算法$盐值$加密后的密码 |
| 3 | 19500 | 最后一次修改密码的时间:从 1970 年 1 月 1 日(Unix 纪元)开始算的天数,19500≈2023 年 10 月 |
| 4 | 0 | 密码最小修改间隔:0 表示 “随时可以改密码”,3 表示 “改完后 3 天内不能再改” |
| 5 | 99999 | 密码有效期:99999≈273 年(默认永不过期),改成 30 表示 “30 天后必须改密码” |
| 6 | 7 | 密码过期前提醒天数:7 表示 “过期前 7 天,每次登录都会提示改密码” |
| 7 | - | 密码过期后宽限期:- 表示 “过期立即锁定”,3 表示 “过期后 3 天内还能登录” |
| 8 | - | 账号失效时间:和字段 3 一样是 “纪元天数”,到点账号直接锁定,- 表示永不过期 |
| 9 | - | 保留字段:预留未来扩展使用 |
3. 加密密码字段:为什么黑客破解不了?
重点看第 2 个字段$6$xyz123$abc456...,这里藏着 Linux 密码的 “安全核心”:
$6$:表示用SHA-512 算法加密(1是 MD5,5是 SHA-256,现在主流用 SHA-512)xyz123:盐值(Salt) —— 加密时随机生成的字符串,即使两个用户密码相同,盐值不同,加密结果也不一样,能有效防止 “彩虹表破解”abc456...:最终的加密结果,单向不可逆(只能加密,不能解密),系统验证密码时,会把你输入的密码用同样的盐值和算法加密,再和这个结果对比,一致就登录成功
4. 关键权限:root 专属的 “私密文件”
用ls -l /etc/shadow看权限:
-r-------- 1 root root 896 Oct 10 14:30 /etc/shadow
只有 root(所有者)有 “读权限(r--)”,其他用户连读的资格都没有 —— 这是 Linux 系统最严格的权限之一,也是密码安全的最后一道防线。
/etc/sudoers
这个文件是 Linux 中 “权限 delegation(委托)” 的核心,决定了哪些用户可以 “借用 root 权限” 执行命令。
-
核心作用:定义用户 / 用户组可执行的 sudo 命令范围(如允许 zhangsan 执行
/usr/bin/ls,但禁止执行/usr/bin/rm)。 -
权限特点:默认权限为
r--r-----.,仅 root 可读,且禁止直接用 vim 编辑(无语法检查,写错会导致 sudo 失效),必须用visudo命令编辑(自带语法校验)。 -
典型配置
:允许 zhangsan 无需输入密码执行所有 root 命令:
zhangsan ALL=(ALL) NOPASSWD: ALL
完整结构拆分:5 个核心部分
这条规则的格式可以简化为:
[用户/组] [允许登录的主机]=(可切换的用户身份) [是否需要密码]: [允许执行的命令]
对应到 zhangsan ALL=(ALL) NOPASSWD: ALL 中,每个部分的含义如下:
1. 第一个字段:zhangsan → 被授权的 “用户或组”
- 作用:指定这条规则给谁用。
- 这里是
zhangsan,表示 “对用户 zhangsan 生效”。 - 若要给用户组授权,需在组名前加
%,例如%dev ALL=(ALL) ALL表示对dev组的所有用户生效。
2. 第二个字段:ALL → 允许从 “哪些主机” 登录执行 sudo
- 作用:限制用户只能从指定的主机登录系统后,才能使用 sudo 权限。
- 这里的
ALL表示 “不限制主机”—— 无论 zhangsan 是从本地服务器登录,还是通过 SSH 从其他主机远程登录,这条规则都生效。 - 实际场景中可替换为具体主机名 / IP,例如:
zhangsan server01=(ALL) ALL→ 仅允许 zhangsan 在主机server01上使用 sudo;zhangsan 192.168.1.0/24=(ALL) ALL→ 仅允许从192.168.1.x网段登录时使用 sudo。
3. 第三个字段:(ALL) → 可以 “切换到哪些用户” 的身份执行命令
- 作用:指定用户执行 sudo 时,能临时切换到哪个用户的权限(默认是切换到 root,但可以限制)。
- 这里的
(ALL)表示 “可以切换到系统中任何用户”(包括 root、普通用户、甚至系统服务用户如apache)。zhangsan ALL=(root) ALL→ 仅允许 zhangsan 切换到 root 身份执行命令;zhangsan ALL=(mysql) ALL→ 仅允许切换到mysql用户身份(适合数据库管理场景,避免过度提权)。
4. 第四个字段:NOPASSWD: → 执行 sudo 时 “是否需要输入密码”
-
作用:控制用户执行
sudo 命令时,是否需要输入自己的登录密码进行验证。 -
这里的
NOPASSWD:是一个关键字,表示 “无需输入密码”——zhangsan 执行sudo rm /tmp/file时,直接生效,不用输密码。 -
若去掉这个关键字(即写成
zhangsan ALL=(ALL) ALL),则执行 sudo 时必须输入 zhangsan 自己的密码(验证身份后才允许提权)。
5. 第五个字段:ALL → 允许执行 “哪些具体命令”
-
作用:限制用户能用 sudo 执行的命令范围(最核心的安全控制字段)。
-
这里的
ALL表示 “允许执行系统中所有命令”(包括rm -rf /这种高危操作)。例如:
zhangsan ALL=(ALL) /bin/ls, /usr/bin/cp→ 仅允许用 sudo 执行ls和cp命令;zhangsan ALL=(root) /etc/init.d/nginx restart→ 仅允许切换到 root 身份重启 nginx 服务。
特殊权限:
SUID
SUID(Set User ID)是给可执行文件加的特殊权限。简单说:当普通用户执行这个文件时,会临时获得文件所有者的权限(执行完就收回),而不是用自己的权限。
举个最经典的例子:passwd命令(修改密码)。
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root 63736 4月 18 2023 /usr/bin/passwd
注意所有者执行位是s(不是x),说明它有 SUID 权限。
passwd的所有者是 root,普通用户执行它时,会临时获得 root 权限,才能修改只有 root 能写的/etc/shadow(密码文件)。- 如果没有 SUID,普通用户根本改不了自己的密码 —— 这就是 SUID 的核心作用:“临时借权”。
怎么识别 SUID 权限?
SUID 的权限位在 “所有者执行位(x)” 上,表现形式有两种:
- 小写
s:表示文件所有者原本有执行权限(x),且已设置 SUID(有效); - 大写
S:表示文件所有者原本没有执行权限(-),虽然设置了 SUID,但无效(因为文件都不能执行,借权也没用)。
3怎么设置 / 取消 SUID?
用chmod命令,两种方式:
- 符号法:
chmod u+s 文件名(给所有者加 SUID);chmod u-s 文件名(取消)。 - 数字法:SUID 的数字标识是
4,把它加在普通权限前(比如chmod 4755 文件名,755是普通权限,4表示 SUID)。
案例:
# 给test.sh设置SUID(假设原权限755)
chmod u+s test.sh
# 此时权限变为 -rwsr-xr-x# 取消SUID
chmod u-s test.sh
# 权限变回 -rwxr-xr-x
SUID 虽然方便,但风险极高,必须牢记这几点:
- 只给可执行文件用:给文本、图片等非可执行文件设置 SUID,完全无效;
- 绝对不能给 shell 设置:如果给
/bin/bash加 SUID,普通用户执行bash会直接获得 root 权限,系统瞬间被攻破; - 能不用就不用:只有像
passwd、ping这种系统必须的命令才需要 SUID,自己写的脚本尽量别用。
SGID
SGID(Set Group ID)比 SUID 更灵活 —— 既能给文件加,也能给目录加,作用还不一样。
对可执行文件:临时 “借” 用文件所属组的权限
和 SUID 类似,但借的是 “组权限”。当用户执行带 SGID 的文件时,会临时获得文件所属组的权限。
举例:wall命令(给所有在线用户发广播)。
ls -l /usr/bin/wall
# 输出:-rwxr-sr-x 1 root tty 32184 4月 18 2023 /usr/bin/wall
组执行位是s,说明有 SGID。wall的所属组是tty(终端设备组),普通用户执行它时,会临时获得tty组权限,才能往/dev/tty(终端设备文件)里写消息 —— 否则广播发不出去。
对目录:新文件自动 “继承” 目录的所属组
这是 SGID 最常用的场景!给目录设置 SGID 后,在该目录下新创建的文件 / 子目录,会自动继承目录的所属组(而不是创建者的默认组),完美解决团队共享文件的 “归属混乱” 问题。
案例:
假设团队有个共享目录/project/dev,需要所有人创建的文件都归dev_team组(方便团队协作):
# 1. 创建目录并设置所属组为dev_team
mkdir -p /project/dev
chown root:dev_team /project/dev # 2. 设置SGID(数字法2+普通权限775)
chmod 2775 /project/dev # 此时目录权限是 drwxr-sr-x(组执行位是s,SGID生效)
现在,团队成员zhangsan(默认组是zhangsan)在里面创建文件:
touch /project/dev/test.txt
ls -l /project/dev/test.txt
# 输出:-rw-rw-r-- 1 zhangsan dev_team ... test.txt
文件的所属组是dev_team(继承目录的组),而非zhangsan的默认组。这样团队所有成员(只要属于dev_team组)都能按组权限操作文件,不用手动改权限
怎么识别和设置 SGID?
- 权限位:在 “组执行位(x)” 上,小写
s(组有执行权限,有效),大写S(组无执行权限,无效)。 - 设置 / 取消:
- 符号法:
chmod g+s 目标(加 SGID);chmod g-s 目标(取消)。 - 数字法:SGID 的数字标识是
2,比如chmod 2775 目录名。
- 符号法:
SGID 的坑点提醒
- 给目录设置 SGID 后,若目录的组权限有
w(写),组内成员能删别人的文件(想阻止?后面讲 SBIT); - 对可执行文件设置 SGID 时,确保所属组权限 “最小化”,别让普通用户借组权限干坏事。
SBIT
SBIT(Sticky Bit,粘滞位)是专门给目录加的权限,作用只有一个:保护目录里的文件,防止被非所有者删除。
1. 啥场景需要 SBIT?
最典型的就是/tmp目录(系统临时文件目录)。所有人都能在/tmp里创建、修改文件,但不能删别人的文件 —— 这就是 SBIT 的功劳。
ls -ld /tmp
# 输出:drwxrwxrwt 12 root root 4096 10月 27 10:00 /tmp
注意其他人执行位是t(不是x),说明有 SBIT。
2. SBIT 的核心规则
在带 SBIT 的目录里,只有三种角色能删除 / 重命名文件:
- 文件的所有者;
- 目录的所有者;
- root 用户。
哪怕其他用户对目录有写权限(o+w),也删不了别人的文件。
3.怎么设置 / 取消 SBIT?
- 权限位:在 “其他人执行位(x)” 上,小写
t(其他人有执行权限,有效),大写T(其他人无执行权限,无效)。 - 设置 / 取消:
- 符号法:
chmod o+t 目录名(加 SBIT);chmod o-t 目录名(取消)。 - 数字法:SBIT 的数字标识是
1,比如chmod 1777 目录名(777允许所有人读写执行,1表示 SBIT)。
- 符号法:
实操案例:创建一个公共目录并加 SBIT
mkdir public
chmod 1777 public # 1(SBIT)+777(全权限)
ls -ld public
# 输出:drwxrwxrwt ... public(其他人执行位是t)
- 只对目录有效:给文件加 SBIT 完全没用(早期 Unix 有特殊作用,现在 Linux 已废弃);
- 目录必须开 “其他人写权限”(
o+w):否则本来就删不了,加 SBIT 多此一举; - 别乱用:非公共目录(比如个人目录)加 SBIT,可能导致自己删文件都麻烦。
四、一张表分清 SUID、SGID、SBIT
| 权限 | 作用对象 | 核心功能 | 权限位位置 | 数字标识 | 典型例子 |
|---|---|---|---|---|---|
| SUID | 可执行文件 | 执行时临时获得文件所有者权限(如普通用户改密码) | 所有者执行位(x) | 4 | /usr/bin/passwd |
| SGID | 可执行文件 / 目录 | 执行文件时临时获组权限;目录新文件继承目录的组(团队共享) | 组执行位(x) | 2 | 团队共享目录/project/dev |
| SBIT | 目录 | 只有文件所有者 / 目录所有者 /root 能删除文件(防删他人文件) | 其他人执行位(x) | 1 | /tmp目录 |
参考:
【Linux用户、用户组与文件权限管理】https://www.bilibili.com/video/BV1iS421d7Vg?vd_source=2884b80d333f3bfc8048b360e6195550
【9.Linux服务与进程管理】https://www.bilibili.com/video/BV19Y4y197nZ?vd_source=2884b80d333f3bfc8048b360e6195550