从零入门Linux系统篇(七)权限篇 · 二:文件权限体系与访问控制机制——从chmod到权限匹配原理
目录一、Linux文件属性与权限模型1.1 文件属性解析——Linux中的三大身份角色1.1.1 文件权限的三类对象——拥有者、所属组与其他用户1.1.2 文件权限的三种能力——读、写、执行1.1.3 补充工具file指令——识别文件真实类型二、修改文件权限——掌控访问能力2.1 权限修改前提——谁有资格修改权限2.2 chmod指令——修改文件权限2.2.1 符号模式通过字符修改权限2.2.2 数字模式通过八进制修改权限三、修改文件归属——管理文件拥有者与所属组3.1 chown与chgrp指令——修改文件角色信息3.2 文件归属修改案例分析四、Linux权限匹配机制——系统如何判断访问权限4.1 权限匹配规则——从身份匹配到权限确认4.2 核心原则——一次匹配立即生效4.3 权限判断案例分析五、重新理解目录权限——目录为什么也需要权限5.1 执行权限x——进入目录的通行证5.2 读取权限r——查看目录内容的能力5.3 写入权限w——修改目录结构的能力一、Linux文件属性与权限模型1.1 文件属性解析——Linux中的三大身份角色当我们敲下ls -l看到眼前那一长串密密麻麻的详细信息时有没有一瞬间好奇过最前面那堆 drwxr-xr-x一样的字母到底在嘀咕些什么drwxr-xr-x 2 root root 22 Aug 1 2026 .pip这一串看似乱码的东西其实正是Linux文件权限的“身份证”。它同时告诉了系统三件事这个文件是什么类型谁可以对它做什么。接下来我们就一层一层把它剥开看。1.1.1 文件权限的三类对象——拥有者、所属组与其他用户ls -l输出的第一列藏着文件的类型和权限。而权限到底是赋予谁的这就得先把Linux里的三大“角色”拎清楚。角色含义拥有者 (Owner)文件的创建者默认对文件拥有最高控制权。所属组 (Group)一组特定用户的集合通过共享权限方便团队协作。其他 (Other)除了拥有者和所属组成员之外系统里的所有人。先厘清一个关键认知角色是角色人是人两码事。张三是张三市长是市长张三可以当市长但“市长”这个角色并不等于张三这个人。在Linux里一个用户登录系统后他在不同文件面前扮演的角色可能完全不同对这个文件他是拥有者对那个文件他可能只是个“其他”。你可能会问为什么输出里只显示了拥有者和所属组的名字却不见Other因为Other根本不需要记录它是用排除法算出来的。凡是既不属于拥有者、也不属于所属组的用户统统归为Other没必要再额外标记。为什么非要有个所属组拿一个场景举例就全明白了。腾讯内部为了保持竞争力经常让不同工作室比如天美和光子同时开发同类产品。假设大家都在同一台服务器上干活。如果只靠个人权限光子工作室的张三写了一份《王者荣耀》策划案只设自己可读。那他的组员李四、王五想要协作怎么办张三只能把权限开放给“所有人Other”。后果是什么一旦开了Other的口子隔壁天美工作室的人也能大摇大摆进来把策划案拷走这还怎么玩所属组就是你的“工作室”。 把张三、李四、王五拉进一个叫photon的组文件设置成photon组可读。于是组内所有人可以共享协作组外的人连门都摸不到。内部透明外部隔绝Linux的权限模型从一开始就想清楚了这件事。天美工作室组组员有老姚、程序员小赵、策划小李他们对天美的项目代码持有rwx光子工作室组组员有阿宇、程序员小周、策划小孙他们对光子的项目代码同样手握rwx。1.1.2 文件权限的三种能力——读、写、执行角色分配搞清楚了接下来轮到权限本身。Linux把权限拆成三块各司其职权限含义r (Read)读取内容。w (Write)修改、编辑内容。x (Execute)执行程序或进入目录。这三个字母对“文件”和“目录”的意义差别不小弄混了容易出乱子一张表说清楚权限对文件的含义对目录的含义r可以查看文件内容如cat、vim可以列出目录下的文件名如lsw可以修改文件内容可以在目录内创建、删除、重命名文件x可以把文件当作程序运行最关键可以进入该目录cd并访问其下的子文件关于“可执行”有一个容易踩坑的认知误区有机会不等于有能力。 一个test.c源文件默认不可执行。就算你手动给它加上x权限它照样跑不起来因为它只是一个文本文件没有经过编译和链接根本不具备“被执行”的能力。权限只是给了你“可以去尝试运行”的机会能不能真跑起来还得看文件本身有没有那个本事。每一个权限位只有两态要么有要么没有。顺序也不允许颠倒永远是rwx。于是一个文件的权限可以用九位二进制来简洁表达。比如下面这行drwxr-xr-x 2 root root 22 Aug 1 2026 .pip权限部分是rwxr-xr-x用二进制写出来就是111 101 101。用更直白的话描述一遍拥有者可读可写可执行所属组可读可执行但不可写其他人可读可执行但不可写。 角色和权限一组合Linux 的安全防线就搭起来了。1.1.3 补充工具file指令——识别文件真实类型指令filefile是Linux里专门用来辨认文件真实类型的命令。遇到一个来路不明的文件别靠猜直接交给 file它就是你的“文件侦探”。基本用法简单到不能再简单file 文件名。它会告诉你这个文件的格式、编码甚至更多底细。file的核心价值在于Linux从不依赖扩展名判断文件类型。它直接读取文件头部的“幻数”Magic Number从二进制层面锁定文件的本质。这意味着就算有人把.sh脚本的后缀改成.jpg想蒙混过关file一眼就能看穿。它的输出能精准区分各种类型ASCII纯文本、ELF二进制可执行文件、目录、甚至图片的分辨率和色彩深度统统逃不过它的眼睛。[rootVM-0-9-opencloudos ~]# file test test: empty [rootVM-0-9-opencloudos ~]# file .bashrc .bashrc: ASCII texttest是个空文件file直接告诉你“empty”.bashrc是个纯文本它就如实汇报“ASCII text”。一清二楚绝不含糊。有了file在Linux的世界里伪装文件类型这种事基本没戏。二、修改文件权限——掌控访问能力2.1 权限修改前提——谁有资格修改权限权限不是你想改想改就能改。先看一个扎心的现场[abcVM-0-9-opencloudos ~]$ chmod 777 TEST.c chmod: changing permissions of TEST.c: Operation not permitted [abcVM-0-9-opencloudos ~]$这个TEST.c是root在abc的家目录里创建的。abc虽然是目录的主人但文件本身不属于他root才是拥有者。于是当abc试图用chmod修改权限时系统直接甩回来一句Operation not permitted。没得商量。换作root呢一切规则形同虚设。root可以修改系统里任何用户创建的任何文件不管文件是谁的、权限怎么写。root面前没有“别人的文件”这个概念他手握整个系统的终极钥匙。2.2 chmod指令——修改文件权限指令chmodchmod是Linux下修改文件或目录权限的核心命令整个权限管理的地基几乎每一次权限调整都绕不开它。它支持两种权限表示方式符号模式直观易懂比如ux给拥有者加执行权限、go-w去掉所属组和其他人的写权限。数字模式简洁高效比如755、644用三位数字一次性敲定所有权限。一条铁律先记住只有文件拥有者或root用户才有资格修改文件的权限。别人想碰门都没有。2.2.1 符号模式通过字符修改权限格式chmod [修改角色][操作符][权限] [文件名称]符号模式的关键是把“谁”和“什么权限”用人能一眼看懂的方式写出来角色符号含义权限符号含义u拥有者userr读g所属组groupw写o其他人otherx执行a所有人all操作符用 加权限、- 减权限一目了然。下面直接实战演示# 初始状态 -rw-r--r-- 1 root root 0 Aug 1 10:27 TEST.c第一步给所有人加上执行权限[rootVM-0-9-opencloudos abc]# chmod ax TEST.c [rootVM-0-9-opencloudos abc]# ls -l TEST.c -rwxr-xr-x 1 root root 0 Auh 1 10:27 TEST.c第二步把所属组的执行权限拿掉[rootVM-0-9-opencloudos abc]# chmod g-x TEST.c [rootVM-0-9-opencloudos abc]# ls -l TEST.c -rwxr--r-x 1 root root 0 Aug 1 10:27 TEST.c第三步给其他人加上写权限[rootVM-0-9-opencloudos abc]# chmod ow TEST.c [rootVM-0-9-opencloudos abc]# ls -l TEST.c -rwxr--rwx 1 root root 0 Aug 1 10:27 TEST.c所以上面其实是拥有者权限 所属组权限 其他人的权限。符号模式就是这样想给谁加什么、去什么直接写上就行不用算数字对初学者尤其友好。ux、go-w、ar看一遍就明白什么意思基本不用死记硬背。2.2.2 数字模式通过八进制修改权限权限的底层其实就是一套九位二进制序列。每三位一组转成十进制就成了我们常说的“数字权限”。换算规则简单到闭眼都能口算r4w2x1加起来即可。拿rwxr-xr--练下手拥有者rwx4 2 1 7所属组r-x4 0 1 5其他人r--4 0 0 4所以这条权限用数字表达就是754。干净利落三个数字拍下去九位权限一次性到位。数字模式的命令格式chmod [三位数字] [文件名]。它最大的优势是快一把梭全搞定缺点也明显没法精细调整某一个角色的权限要么全改要么不动。如果你想“只给拥有者加x”那还是乖乖用符号模式。为了随手查这张数字权限速查表可以存下来数字二进制rwx含义常见场景0000---毫无权限彻底封死某个身份极少见1001--x仅执行能跑不能读源码极少见2010-w-仅写入盲写模式不能看只能改极罕见3011-wx写执行目录专用能进能创建但不能列出文件4100r--只读配置文件常见保平安5101r-x读执行目录标配能进能列不能改6110rw-读写普通文件标配能看能改不能跑7111rwx全能最高权限拥有者完全控制最后看个实战例子——把TEST.c直接拉满到 777[abcVM-0-9-opencloudos ~]$ sudo chmod 777 TEST.c [sudo] password for abc: Sorry, try again. [sudo] password for abc: [abcVM-0-9-opencloudos ~]$ ls -l TEST.c -rwxrwxrwx 1 root root 0 Aug 1 10:27 TEST.c三、修改文件归属——管理文件拥有者与所属组3.1 chown与chgrp指令——修改文件角色信息指令chownchown是Linux中修改文件或目录所属用户的命令权限管理里的重要武器。基本用法chown用户名 文件名直接更换文件的拥有者。它还支持一条命令同时改所有者和所属组chown用户名:组名 文件名一步到位。一条硬规矩只有root用户才能执行chown。普通用户就算自己创建的文件也不能转让给别人——防止你把文件“嫁祸”给其他用户系统的权责链必须清晰。指令chgrpchgrp是专门修改文件或目录所属组的命令权限管理中的辅助工具。基本用法chgrp 组名 文件名把文件的所属组切换到目标组。它的使用门槛比chown稍低文件拥有者和root都可以执行chgrp但有个前提拥有者本身必须是目标组的成员不能把自己都不属于的组硬塞给文件。实际上chown完全能覆盖chgrp的功能。chown :组名 文件名 就能单独改所属组。正因如此chgrp在实战中的出镜率不高但你看到别人用它时心里得明白它在干什么。3.2 文件归属修改案例分析前面讲的规则动手敲一遍就全记住了。来看实际操作[abcVM-0-9-opencloudos ~]$ chown root test chown: changing ownership of test: Operation not permittedabc想把test文件送给root系统直接回绝Operation not permitted。普通用户没有转让文件的权力哪怕文件是自己亲手创建的也不行。这就是chown的铁律只有root能碰。加上sudo提权再试[abcVM-0-9-opencloudos ~]$ sudo chown root test [sudo] password for abc: [abcVM-0-9-opencloudos ~]$ ls -l test -rwxr-xr-x 1 root abc 48112 Aug 1 11:08 test现在拥有者变成了root所属组暂时还是abc。接下来顺手把所属组也改成root用chgrp或chown都行[abcVM-0-9-opencloudos ~]$ sudo chgrp root test [abcVM-0-9-opencloudos ~]$ ls -l test -rwxr-xr-x 1 root root 48112 Aug 1 11:08 test两条命令下去test文件彻底归属root。注意chgrp这里同样加了sudo因为abc并不在root组里想改过去只能提权。如果目标组恰好是自己所在的组那就不用sudo文件拥有者可以直接操作。从这个案例能看出一个明确的设计意图系统不鼓励你随便把文件“送”给别人。原因很简单——谁也猜不到你这个文件里到底装着什么贸然转移所有权可能留下安全漏洞。所以 Linux 的选择是只有root才有资格拍板普通用户想都别想。顺便学一个小技巧chown支持“拥有者:所属组”的连写格式一条命令同时改两个身份干净利落。[abcVM-0-9-opencloudos ~]$ ls -l test ----rwxrwx 1 abc abc 48112 Aug 1 11:08 test [abcVM-0-9-opencloudos ~]$ sudo chown root:root test [sudo] password for abc: [abcVM-0-9-opencloudos ~]$ ls -l test ----rwxrwx 1 root root 48112 Aug 1 11:08 test四、Linux权限匹配机制——系统如何判断访问权限在 Linux里当一个用户试图访问某个文件时内核并不是把三层权限叠加起来做“综合评估”而是按一套严格的优先级进行一次性的身份匹配。4.1 权限匹配规则——从身份匹配到权限确认系统会按顺序问三个问题问到一个就停第一优先级你是不是拥有者Owner是——好直接套用拥有者的权限后面不用看了。第二优先级你是不是所属组Group的成员不是拥有者但是同组——那好套用所属组的权限结束。第三优先级前两档都不沾边那就归为其他用户Others对应权限落锤。4.2 核心原则——一次匹配立即生效这整段逻辑里最容易被忽略、也最容易踩坑的地方就在这儿身份判定是一次性的绝不叠加。系统一旦命中其中一种身份立刻锁死绝不会再往下翻第二档。举个例子你是文件的拥有者但同时也是所属组的成员。文件权限设为----rwxrwx拥有者毫无权限所属组却可以读写执行。你满怀信心地去访问结果被系统一巴掌拦住。为什么因为在第一优先级系统就已经认出你是拥有者直接给了你拥有者该有的“一无所有”。至于后面所属组的宽厚政策根本轮不到你享用。所以记住这条铁律Linux 的权限是“看人下菜”不是“取长补短”。系统只认你匹配上的第一层身份其他层的权限跟你毫无关系。4.3 权限判断案例分析来看一个让人“怀疑人生”的真实场景权限明明写着rwx可你就是动不了这个文件[abcVM-0-9-opencloudos ~]$ ls -l test ----rwxrwx 1 abc abc 48112 Aug 1 11:15 test [abcVM-0-9-opencloudos ~]$ cat helloworld test -bash: test: Permission denied是不是很诡异test文件的所属组和其他人的权限都是rwx而abc明明就在自己所属的abc组里。按理说组权限宽得很怎么连写个文件都不行别急我们把系统那套匹配逻辑套进去走一遍身份识别系统一看当前用户是abc文件的拥有者也是abc第一优先级直接命中。权限锁定命中“拥有者”身份后系统立刻锁定对应的权限位。好家伙是四个杠---无读、无写、无执行。逻辑短路虽然abc同时属于abc所属组组的权限是肥得流油的rwx但系统根本不往下看了。第一层已经匹配组权限再宽厚也跟你没关系。所以结论很清晰Linux权限匹配遵循“身份唯一性”。你是拥有者就只能拿拥有者的权限哪怕所属组的权限比你的丰厚一百倍你也休想“越级”享用。顺带提一句以上一切规则对root统统无效。root拥有系统最高权限文件权限位拦不住它读写内容文件所有权也拦不住它修改归属。root面前这道精心设计的权限防线就是一层透明的玻璃。五、重新理解目录权限——目录为什么也需要权限目录这东西在Linux眼里和普通文件根本不是一回事。它的本质是一张“文件名与Inode的映射表”目录里不存文件内容只存“谁叫什么名字住在哪个Inode”。正因如此目录的rwx含义跟普通文件判若两人。5.1 执行权限x——进入目录的通行证x权限对目录来说只决定一件事你能不能跨进这道门槛。有x就能cd进去也能穿透目录访问它下面的子文件没有x整个目录就是一堵铁墙连门都找不到。实战中最常见的场景别人家目录的“防窥”设计#当前用户abc想溜进otheruser的家目录 [abcVM-0-9-opencloudos ~]$ ls -ld /home/otheruser drwx------ 3 otheruser otheruser 4096 Aug 1 11:26 /home/otheruser # 试试就逝世 [abcVM-0-9-opencloudos ~]$ cd /home/otheruser -bash: cd: /home/otheruser: Permission denied/home/otheruser的权限是drwx------拥有者可读可写可执行所属组和其他人全是杠没有权限。abc不属于otheruser直接被挡在门外。结论很简单目录缺少x权限就等于门上了锁。 你可以在门外探头探脑但想进去系统一秒拒绝。目录权限这一课x是绝对的第一主角后面要讲的r和w都建立在你能“进门”的前提之上。5.2 读取权限r——查看目录内容的能力r权限对目录而言只管一件事能不能看到目录里都住了谁。有r就能用ls列出文件名没有r连名单都看不了。但这里有个很容易栽跟头的坑光有r没有x就像隔着毛玻璃看门牌名字勉强能瞅见至于文件多大、谁家的、什么时候搬来的一概不知。实战演示一下这个尴尬场面。先把my_dir设成只读444x权限全撤掉[abcVM-0-9-opencloudos ~]$ chmod 444 my_dir [abcVM-0-9-opencloudos ~]$ ls -l my_dir ls: cannot access my_dir/test.txt: Permission denied -????????? ? ? ? ? ? test.txt这一屏输出信息量很大。ls倒是把文件名test.txt亮出来了毕竟r还在目录里的住户名单还能看。但当它想进一步翻看每个文件的Inode详细信息时权限位、大小、时间戳等系统一把拦住没有x权限根本进不了目录内部去查户口。于是权限位全是问号大小问号日期问号除了名字一片茫然。所以结论是目录的r权限只能给你“表面一层”的信息。想看到文件的实质细节x权限不可或缺。有x没r你能进目录但列不了单子有实际需求后面会讲有r没x你能看到名字但等于隔靴搔痒。二者配合才算目录的完整访问能力。5.3 写入权限w——修改目录结构的能力w权限对目录而言管的是目录里能折腾出什么动静能不能在里面创建新文件、能不能删除已有文件、能不能给文件改名。一句话总结有没有w决定了你能不能动目录这张“登记表”。这也是目录权限里最危险的一项。看个让人倒吸凉气的场景# abc 拥有 test_dir 的全部权限但目录里藏着一个 root 创建的保护文件 [abcVM-0-9-opencloudos ~]$ ls -ld test_dir drwxrwxrwx 2 abc abc 4096 Aug 1 11:19 test_dir [abcVM-0-9-opencloudos ~]$ ls -l test_dir/root_file -r-------- 1 root root 0 Aug 1 11:19 test_dir/root_file # abc 尝试删掉 root 的这个文件 [abcVM-0-9-opencloudos ~]$ rm test_dir/root_file rm: remove write-protected regular empty file test_dir/root_file? y # 删除成功是不是有点破防abc连读这个文件的权限都没有-r--------只有root自己能读却能把它给删了。系统甚至贴心地问了一句“这是个写保护的文件你确定吗”abc回了一个y文件就没了。这里藏着一个极容易被忽视的底层逻辑删除文件本质上不是修改文件本身而是修改它所在的目录。目录就是一张“文件名→Inode”的映射表你把文件删掉不过是把表里对应那一行划掉了而已。所以系统判断你有没有资格删除时看的是你对目录有没有权限至于文件本身你读不读得了、改不改得了根本不重要。这也解释了为什么团队共享目录时w权限要万分谨慎地分配。一旦你把目录的写权限交出去就等同于交出了目录里所有文件的“生杀大权”包括别人创建的那些你连看都看不了的文件。从su的用户切换到sudo的临时提权再到rwx三大权限与拥有者、所属组、其他人的精密匹配Linux的权限体系说复杂也复杂说简单其实就一句话先确认你是谁再查你能做什么一次匹配概不叠加。这里面有几个关键认知值得再嚼一遍su和su -的区别本质是“换马甲”和“换全套”的区别背后靠的是进程的父子栈结构撑腰。sudo不是万能的它只借权给白名单里的人用完就收回去五分钟窗口期是效率与安全的折中。文件权限的rwx对文件和目录含义迥异目录的w权限尤其凶险它能把不属于你的文件删得一干二净。把这些地基打牢后面再去理解更复杂的概念比如接下来要讲的粘滞位它专门用来解决共享目录里“你能写但你不能删别人文件”的问题会顺畅很多。权限这一课还没完我们下篇继续。