Linux 常用命令学习笔记(权限管理篇):看懂 rwx,管好每一份文件的生杀大权


Linux 常用命令学习笔记(用户管理篇) 里,我们把"谁在操作、有哪些组、权限主体是谁"讲明白了------文件有属主(user)、有属组(group),新建文件默认属组是你的主组。但那一篇结尾我打了个包票:"那一串 -rw-r--r-- 到底是什么意思?怎么用 chmod / chown / chgrp 改?"

今天就来兑现。权限管理,是 Linux"一切皆文件"哲学下最硬核、也最容易翻车的一环。改对了,系统井井有条;改错了,一句 chmod -R 777 能把安全防线直接拆光。这篇从"看懂权限字符串"一路讲到"特殊权限位(SUID / SGID / 粘滞位)"和"进程权限 UID",一次讲透。

读完你会发现:所谓权限,本质就是"用户/组 + 三种操作(rwx)+ 作用在文件/目录上的差异"三件事的组合。先把这套组合拳练熟,你才算真正摸到了 Linux 系统管理的门把手。


前情回顾:本篇要"接"上哪些旧工具

之前学过的 本篇怎么接上它
ls -l / ls -la(基础篇、用户管理篇) 本篇教你怎么看懂 那串 drwxr-xr-x,并重点讲清"目录的执行位 x"和"文件的执行位"区别
文件属主 / 属组(用户管理篇) 本篇用 chown / chgrp 改它们,并讲清属主 / 属组 / 其他人三组权限各管谁
sudo(用户管理篇) 改文件所有者、设 SUID 常需 sudo,本篇处处会用到
Vim / Emacs(高级篇) 改文件内容前先确认权限够不够;本篇提醒:别拿编辑器去硬改 /etc/passwd,要用专用命令

记住一个核心心法:权限 = 对"谁"(u/g/o)授予"什么操作"(r/w/x)。先认人(用户管理篇),再授权(本篇)。


一、文件权限

当我们用 ls -l 以详细格式列出文件,第一列那串字符就是权限。先来看个例子:

复制代码
$ ls -l Desktop/
drwxr-xr-x 2 pete penguins 4096 Dec 1 11:45 .

我们重点关注第一列 drwxr-xr-x。它其实由四部分组成:

  • 第 1 个字符:文件类型d 表示这是一个目录 (Directory);普通文件是 -;符号链接是 l,等等。

  • 后面 9 个字符:权限 ,分成三组、每组三个,对应"用户 / 组 / 其他人":

    d | rwx | r-x | r-x
    | 用户 | 组 | 其他人

每组里的字符含义固定:

字符 含义 字符 含义
r 读(Read) - 不授予该权限
w 写(Write)
x 执行(Execute)

关键差异:文件的 x vs 目录的 x

  • 文件x 表示"可以把这个文件当程序运行"。

  • 目录x 表示"可以 cd 进入这个目录、访问其中的文件"。一个目录如果没有 x,哪怕你有 r(能列出文件名),也进不去、打不开里面的文件。

三组权限分别作用于不同层级:

  1. 用户(所有者,user) :第一组 rwx,作用于文件的主人。上面例子里主人是 pete,他拥有读、写、执行全权限。

  2. 组(group) :第二组 r-x,作用于和文件关联的组 penguins。组里的人能读、能进,但不能写。

  3. 其他人(others) :第三组 r-x,作用于系统上所有其他用户。他们同样能读、能进,不能写。


二、修改权限

要改权限,主力命令是 chmod (change mode)。它提供两种模式:**符号模式数字(八进制)模式**。

2.1 符号模式

用字母表示"改谁"和"怎么改":

  • u = user(所有者)、g = group(组)、o = others(其他人)、a = all(全部)

  • + 添加权限、- 移除权限、= 直接设定

    chmod u+x myfile # 给"用户"添加执行权限
    chmod g-w myfile # 把"组"的写权限移除
    chmod ug+w myfile # 同时给用户和组添加写权限
    chmod a=r myfile # 所有人只保留读权限(= 直接设定)

2.2 数字(八进制)模式

把权限用三个数字一次设完,每位对应"用户 / 组 / 其他人":

数字 含义 组成
4 读(r)
2 写(w)
1 执行(x)
7 rwx 4+2+1
5 r-x 4+0+1
6 rw- 4+2+0
复制代码
chmod 755 myfile

拆解 755

  • 7(用户)4+2+1rwx

  • 5(组)4+0+1r-x

  • 5(其他人)4+0+1r-x

2.3 安全红线:别碰 777

大坑警告chmod -R 777 /some/directory 是新手最常见的危险操作之一。它给所有人 完全的读、写、执行权限,等于把敏感文件敞开给任何本地用户。永远遵循最小权限原则------只给确实必要的权限。


三、chown 与 chgrp

光改权限不够,有时还得改"这份文件归谁"。这就用到 chown (change owner)和 chgrp (change group)。改你不拥有的文件,通常需要 sudo

复制代码
sudo chown patty myfile          # 把文件所有者改成用户 patty
sudo chgrp whales myfile         # 把文件所属组改成 whales
sudo chown patty:whales myfile   # 一步同时改用户和组(用户名:组名)

小技巧:chown 用冒号 : 隔开用户和组,一次搞定两者,是日常最常用写法。


四、umask

每个新建文件都有一组默认权限。想改这套默认值,用 umask。它用的也是三位数字权限集,但含义相反------umask 是"移除"这些权限,而不是"添加"。

复制代码
umask 021

上面表示:新文件的默认权限里,用户全给、组移除写(2)、其他人移除执行(1)。大多数发行版默认 umask022:用户完全访问,组和其他人没有写权限。

注意:umask 只在当前 shell 会话有效。想永久生效,要把它写进启动文件(如 .profile)------这点留到后面的 shell 课程再展开。


五、Setuid(SUID)

有时普通用户需要临时"提权"干点事------总不能每次都让管理员来输 root 密码。SUID 就是干这个的:设置了 SUID 的文件,运行它的人会暂时获得"该文件所有者"的权限(通常就是 root)。

最经典的例子是改密码:

复制代码
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1134 Dec 1 11:45 /etc/shadow      # 只有 root 能读

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd   # 注意那个 s!

/usr/bin/passwd 的权限里出现了一个新位 s ,这就是 SUID。当你运行 passwd,你其实是以 root 身份 在改 /etc/shadow,所以普通用户也能改自己密码。

修改 SUID 同样有两种写法:

复制代码
sudo chmod u+s myfile     # 符号模式
sudo chmod 4755 myfile    # 数字模式:4 代表 SUID,前置

你会看到有时 SUID 显示成大写 S ------意思是"设了 SUID 但没有执行位",作用和 s 一样,只是这份文件本身不能被直接执行。


六、Setgid(SGID)

和 SUID 类似,SGID 让程序以"该文件所属组"的身份运行 。权限位出现在那一组里:

复制代码
$ ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 19024 Dec 14 11:45 /usr/bin/wall   # 组权限里的 s

修改 SGID:

复制代码
sudo chmod g+s myfile     # 符号模式
sudo chmod 2555 myfile    # 数字模式:2 代表 SGID,前置

七、进程权

SUID 讲完,引出一个更深层的问题。你用 SUID 的 passwd 跑起来时,确实暂时是 root 了------那是不是就能顺手改 Sally 的密码?答案是不能 ,因为 Linux 给每个进程维护了三种 UID

UID 类型 含义
有效 UID(effective UID) 进程当前"以谁的身份"访问资源。决定权限判定的就是它
真实 UID(real UID) 真正启动这个进程的用户的 ID,用来追溯"是谁干的"
保存 UID(saved UID) 允许进程在"有效 UID"和"真实 UID"之间来回切换,避免一直以高权限运行

passwd 串起来看:

  1. 你(UID 500)运行程序,真实 UID = 500;

  2. 因为 passwd 有 SUID,有效 UID 被提成了文件所有者 root 的 UID = 0

  3. 所以进程能以 root 身份读写 /etc/shadow------你能改自己的密码;

  4. 但你想改 Sally(UID 600)的密码时,进程还记得你的真实 UID 是 500,不是 root 授权的"改任何人"操作,于是被拒。

一句话:SUID 只是临时借你文件主人的身份去访问资源,并没有把"你是谁"抹掉。 大多数时候真实 UID 和有效 UID 相同,只有在 passwd 这类特例里才会分离。


八、粘滞位

最后一个特殊权限位------粘滞位 ,专门用在目录 上。设了粘滞位的目录,里面的文件只有文件所有者、目录所有者或 root 才能删除/重命名,其他人就算对该目录有写权限也动不了别人的文件。

最常见的例子就是 /tmp

复制代码
$ ls -ld /tmp
drwxrwxrwt 17 root root 4096 Dec 15 11:45 /tmp   # 末尾的 t 就是粘滞位

任何用户都能在 /tmp 建文件(全员可写),但不能删除别人的文件------这正是粘滞位在保护。

设置粘滞位:

复制代码
chmod +t my_shared_dir          # 符号模式
chmod 1755 my_shared_dir        # 数字模式:1 代表粘滞位,前置(rwxr-xr-x + t)

九、特殊权限位速查表

把三种特殊权限位和数字表示放一起,方便记忆:

特殊位 数字 出现位置 作用
SUID 4 用户组(第 1 位) 运行文件时获得文件所有者的权限
SGID 2 组(第 2 位) 运行文件时获得文件所属组的权限
粘滞位 1 其他人(第 3 位) 目录内文件只能由所有者/root 删除

所以一个完整的四位权限码(如 475527551755)就是"特殊位 + 普通三位"。


小结

这一篇,我们把"文件权限"这根线彻底拉通了:

  • 权限字符串drwxr-xr-x = 文件类型 + 用户/组/其他人三组 rwx;目录的 x 是"能进",文件的 x 是"能运行";

  • chmod 两种写法 :符号模式(u+x / g-w,直观)和数字模式(755,省事);**红线是别碰 777**;

  • chown / chgrp :改属主、改属组,冒号写法一步到位,记得加 sudo

  • umask :新文件默认权限的"减法",默认 022

  • 三大特殊位:SUID(4,借所有者身份)、SGID(2,借组身份)、粘滞位(1,共享目录各删各的);

  • 进程权限 :真实/有效/保存三种 UID,解释了为什么 passwd 能改自己密码却动不了别人的。

回看整个 Linux 命令系列:基础篇 摸单兵命令(ls/cat/whoami)→ 进阶篇 用管道和文本工具批量处理 → 高级篇 用正则 + Vim/Emacs 精修文件 → 用户管理篇 搞清"谁在操作、有哪些组"→ 本篇 给文件分配读写执行、守住系统安全。五篇连起来,Linux 命令行的能力版图才算真正闭环。

如果在练手时想有个能随手敲命令的环境,前面几篇都推荐过的 Linux Journey(https://labex.io/linuxjourney 同样适合本篇:网页里就能实操 chmodchown、翻 /etc/passwd,边学边练印象最深。


📎 Linux 学习系列 · 全部文章

  1. Linux 常用命令学习笔记(基础篇):基础命令

  2. Linux 常用命令学习笔记(进阶篇):I/O重定向和文本处理

  3. Linux 常用命令学习笔记(高级篇):正则表达式与 Vim / Emacs 编辑器习笔记

  4. Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙

  5. Linux 常用命令学习笔记(权限管理篇):看懂 rwx,管好每一份文件的生杀大权

如果这篇对你有帮助,欢迎点赞、收藏、关注,你的支持是我继续整理下去的动力~ 下一篇打算聊"进程"(了解系统上正在运行的那些进程),关注本博客,我们进阶路上见。

相关推荐
GGMM7891 小时前
施耐德 VX5A1HC90110(VX5A1HD9011)ATV61/ATV71 90‑110KW 电源驱动板详解
笔记·变频器·变频器维修
Wang's Blog2 小时前
PostgreSQL笔记48: 全文检索与向量检索的对比与混合检索实践
笔记·postgresql·全文检索
liuyicenysabel3 小时前
Flask 个人站 iProfile 上线笔记(k3s + Nginx + Let‘s Encrypt)
笔记·nginx·flask
深蓝海拓3 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十五)后续完善和改进:PLC端数据解析的防粘包、残包、废包、拆包
笔记·学习·plc
lxw20230271163 小时前
k8s安装部署(利用ansible)
linux·kubernetes·ansible
小黄蚁3 小时前
LVGL学习笔记(六)
笔记·学习
爱和冰阔落3 小时前
【Linux】Ctrl+C 到底做了什么?从键盘、kill 到 alarm,一次讲清信号的产生
linux·运维·c++·安卓
zyf1044164 小时前
暑期实践日志 Day33:整体复盘核查视频,完善剪辑成果
学习·计算机网络·剪辑·暑期实践·课题任务
JavaPub-rodert4 小时前
Linux 下部署 MongoDB:从安装、配置到生产环境使用
linux·运维·mongodb
01_ice4 小时前
前端学习css
前端·css·学习