如果让我评一个“看起来最简单、实际最能藏坑”的Linux主题,我会把这个位置留给权限管理。前段时间同事A找我排查一个现象:某项目目录里有个upload.sh,权限明明是755,属主也对,但执行起来就是一直报权限不足。我顺着链路检查,最后发现根源根本不在脚本本身,而是脚本所在目录缺失了x权限。像这样的误判,几乎每周都能碰到几次,而且不止新人在踩,不少有几年经验的老手也会栽在同一类问题上。
这篇文章从文件权限和目录权限的差异说起,把chmod、umask、SUID/SGID/Sticky、ACL、sudo这些绕不开的概念串成一条实用的主线,最后用一个完整的权限排查实录复盘排查思路。无论你是刚接触Linux的开发者,还是需要管理多台服务器的运维,这些内容都能直接用来解决手上的问题。
1. 先搞明白:rwx在文件和目录上,是两套完全不同的规则
1.1 文件上的rwx:r是读取、w是修改、x是执行,但w不等于能删
文件权限的三元组rwx,对文件的含义是固定的:r表示可以读取文件内容,w表示可以修改文件内容,x表示可以把它当作程序来执行。这一点大多数人都清楚,但有一个误区非常普遍——很多人以为对文件有w权限,就能删除或重命名这个文件。这是错的。删除、重命名文件的权限,属于这个文件所在的目录,而不是文件自己。
我见过一个典型的现场:用户A在/tmp/shared/下创建了一个notes.txt,权限设成了666,想让其他人随意改动内容。结果同事B费了半天劲也删不掉这个文件。原因很简单,目录/tmp/shared的权限是755,只有root能在这个目录里增删条目,其他人即便能修改文件内容,也无法把文件本身从目录里移除。这里面的逻辑是:文件内容存在于文件系统里,但“这个文件叫什么名字、挂在哪个目录下”这件事,由所在目录的数据结构决定。所以对文件本身的w只覆盖内容,目录的w才覆盖“存在与否”。
另一个值得注意的点是x权限。对文件而言,x只表示“能否执行”,并不代表一定可以读。所以如果给一个二进制程序只设x不设r,它能运行但你不能把它拖出来做逆向分析;反过来,给脚本设了x但脚本解释器没有权限,照样跑不了。这些细节一旦理解透,后面排查Permission denied的时候会快很多。
1.2 目录上的rwx:r只是列表,x才是通行证
目录权限和文件权限是完全两套语义,很多人栽跟头就是因为把文件的惯性思维套在目录上。目录的r权限,代表的是“能否列出这个目录里的文件名”,仅此而已;目录的w权限,代表的是“能否在这个目录里创建、删除、重命名条目”;目录的x权限,代表的是“能否穿过这个目录,访问它里面的内容”。
我用一个生活化的类比:目录就像一栋楼的单元门禁,r权限是你面前有一块住户名单面板,能看到有哪些房间,但你没有门禁卡进不了楼;x权限才是门禁卡,有了它你才能进入楼道,走到具体房间门口;而w权限决定的是你能否在楼道里贴纸条、拆门牌。一个目录如果只有r和w却没有x,你就是个只能站在门口看名单、却永远进不去干活的保安。
目录的x权限之所以关键,是因为Linux对路径中每一级目录的访问都要检查x。你要读取/home/alice/doc/report.txt,系统会依次检查/home、/home/alice、/home/alice/doc这三个目录是否都给你开放了x权限。任何一个环节缺失,后面就算权限给得再全,你也到不了文件跟前。这就是为什么可以用chmod限制访问路径中某一级目录,从而“封死”整棵子树。
1.3 三个经常让人发懵的目录权限组合
日常排查中,下面这三种情况出现频率最高,我把它们整理成了一张速查表:
| 目录权限(owner视角) | 实际效果 | 典型例子 |
|---|---|---|
| r-- | 可以ls看到文件名,但无法访问任何文件内容,连读都不行 | ls正常,cat报错 |
| --x | 可以cd进入目录,但ls看不到名字;如果知道完整文件名,能直接读取或执行 | 只有已知路径的情况能访问 |
| -wx | 看起来能写,实际上无法创建和删除文件,也必须配合r或x才能生效 | touch文件报权限拒绝 |
第一种r--最迷惑人。你ls能看到一个文件,文件名、大小、修改时间都在眼前,但一用cat打开就报Permission denied。原因是访问文件内容需要目录的x权限,r只能让你“看到名字”,不能让你“找到实体”。第二种--x相反,进入了目录却什么都列不出来,但你如果能事先知道文件名叫什么,是可以直接读写它的。第三种-wx更隐蔽,因为w和x都给了,却唯独少了r,导致无法获取目录项,增删操作同样做不了。
这三个组合告诉我一件事:给目录设权限时,不要只想着“给写权限就好”,要同时考虑读和执行。实际安全生产环境里,最常见的目录权限是755和750,前者是让所有人能进能看,后者是只让属主和同组人进。
1.4 一个反直觉的例子:为什么文件有r权限,你还是读不到
把上面的知识串起来看一个具体例子。假设服务器上有这样一个路径:
/data/project/note.txt文件的权限是标准的644,也就是说所有用户都有r权限。但如果你恰好对/data/project这个目录没有x权限,那么当你执行cat /data/project/note.txt时,系统会在目录访问这一层就把你挡下来。你会看到一行冷冰冰的Permission denied,而且第一反应大概率是怀疑文件权限,去反复chmod 777,结果毫无变化。
我之所以要单独把这个例子拎出来,是因为它是权限管理里“第一层归因错误”的经典代表。文件权限没问题、属主没问题、ACL也查了,最后发现是路径上某一级目录把x剥夺了。理解了目录x是访问路径的通行证之后,这类问题的排查就不再是玄学,而是一个固定套路:从根路径开始一级一级往下验证x权限。
2. chmod数字与umask:权限位运算里最容易踩的两个坑
2.1 为什么权限数字是4、2、1而不是别的数字
很多新手背chmod参数,记住755是rwxr-xr-x,644是rw-r--r--,但问一句为什么r是4、w是2、x是1,就答不上来了。其实这是最基本的二进制位运算:把rwx看作三个独立的开关,r占第2位(值为4),w占第1位(值为2),x占第0位(值为1)。三个全开就是4+2+1=7,二进制写作111;只开r和x则是4+1=5,二进制是101。
比如你要设chmod 750 file.txt,系统实际做的是:把owner三位设为rwx,group三位设为r-x,other三位设为---。换算成命令就是chmod u=rwx,g=rx,o= file.txt。理解了这个位运算逻辑,你就不需要死记硬背,遇到任何数字都能反推出权限组合,也能理解为什么7和3这种数字会出现。
顺带提一个容易出错的地方:chmod的数字模式是“整体覆盖”,也就是说你写chmod 644时,系统会把owner、group、other三组权限全部重置成你指定的值。如果你本来只想改group的权限,却用了数字模式,会把owner和其他人的位也一起改了。这个问题会在后面讲符号模式时再展开,但先在心里留个印象:数字模式是绝对值赋值,不是增量修改。
2.2 umask是位屏蔽,不是算术减法
umask是Linux里控制“新建文件默认权限”的机制,网上搜索出来的解释多半是“默认权限减去umask”。对于常见的022这种值,减法确实能得出正确结果:文件666-022=644,目录777-022=755。但这只是巧合。真正的语义是位屏蔽(bit mask),公式是这样的:
实际权限 = 默认权限 & ~umaskLinux给新建文件的默认权限是666,给新建目录的默认权限是777。为什么文件不是777?因为如果新建文件默认带x,那每次落地的文件都可能直接被当成程序执行,这显然不安全,所以文件默认不带执行位。位屏蔽的意思是,umask里为1的位,最终权限里要被清零。
举个例子,umask=0022时,文件权限计算是666 & ~0022,把group的w和other的w位去掉,得到644;目录权限是777 & ~0022,得到755。如果umask=0002,则文件得到664,目录得到775,这是很多开发团队为了让同组成员可写而特意设置的。当你明白这是位运算之后,就不会再被“666-0002=664”这种像素级巧合误导,遇到umask=0077这种极端值也能立刻算出结果:文件600,目录700。
2.3 符号模式适合日常,数字模式适合脚本
我平时改权限,强烈建议优先用符号模式,也就是chmod u+x、chmod g-w、chmod o=r这样的写法。符号模式的本质是只对你指定的那一位做操作,其他位一概不动。这样你在执行chmod u+x script.sh时,它只是给owner加上了执行权限,不会像数字模式那样把整个权限组重置掉。
数字模式的“整体覆盖”特性也不是没用,它在两个场景里很有价值:一是写脚本和自动化配置时,目标权限是明确已知的,用数字最直接,比如部署服务时统一chmod 750一个目录;二是恢复系统到某个确定状态时,比如把配置文件强制设成644,避免继承到乱七八糟的旧权限。所以我自己的习惯是:交互式命令行里多用符号模式,脚本和批处理里用数字模式,两者结合能省掉很多误操作后的补救时间。
3. SUID、SGID、Sticky:三个特殊权限位的用法与安全边界
3.1 SUID:让一个小程序临时“换身份”执行
普通权限解决的是“谁能做什么”,SUID(Set User ID)解决的是“谁能以谁的身份做什么”。最经典的例子是passwd命令。普通用户要修改自己的密码,而密码存在只有root能写的/etc/shadow里,如果按普通权限的逻辑,用户根本改不了。但passwd命令带SUID位,表现为文件权限里的-rwsr-xr-x,那个s出现在owner的执行位上。当普通用户执行passwd时,进程的有效用户ID会临时切换为文件属主root,于是它能以root的身份去修改shadow文件,但只能执行passwd程序里写好的逻辑,不能随便执行其他root命令。
SUID的机制可以理解为“程序级别的临时提权”。它的价值在于:不需要把root密码给普通用户,也不需要给用户sudo权限,只要某一个小工具被root设置了SUID,用户就能在这个工具限定的范围内完成需要提权的操作。但风险也随之而来:如果一个SUID程序存在漏洞,攻击者可能借它拿到root权限。这也是为什么安全基线里反复强调“SUID程序越少越好”。
设置和取消SUID的命令也很直接:
chmod u+s /path/to/program # 或 chmod 4755 /path/to/program chmod u-s /path/to/program # 去掉SUID要注意的是,s占的是owner的x位。如果文件本来没有x权限,设置了SUID后ls显示的是大写的S,表示SUID位虽然存在但无法生效。这种状态下程序执行不了,等于白设。
3.2 SGID:文件上是加组,目录上是自动继承属组
SGID(Set Group ID)有两个完全不同的行为,很多人只知其一。
在文件上,SGID的作用和SUID类似:执行文件时,进程的有效组ID会临时变为文件属组。经典例子是某些需要访问共享组数据的工具,比如早期的write命令。文件权限表现为-rwxr-sr-x,s出现在group的执行位上。
在目录上,SGID的意义更大,它能让“新建文件自动继承目录的属组”。这才是团队协作场景里真正好用的特性。举个例子:项目组有一个共享目录/data/team,属主是root,属组是project,权限设成2775。任何属于project组的成员在这个目录里新建文件,文件的属组都会被自动设为project,而不是新建者自己的主组。这样即使不同成员的默认组不同,文件也能被整个项目组统一管理。
设置方式:
chmod g+s /data/team # 或 chmod 2775 /data/team chmod g-s /data/team # 去掉SGID对目录设置SGID几乎只有好处,没有明显的安全风险,所以在共享目录、CI产物目录、日志收集目录里都可以放心使用。它和后面要讲的ACL配合起来,能解决大部分团队协作权限问题。
3.3 Sticky位:共享目录的最后一道闸
Sticky位(粘滞位)是三个特殊权限里最容易理解的,它的作用是:在一个全局可写的目录里,只有文件属主、目录属主或root才能删除、重命名文件。最常见的例子就是/tmp目录,权限是drwxrwxrwt,那个t出现在other的执行位上。
试着想象没有Sticky位的场景:/tmp是777目录,任何人都能在这里创建文件,但理论上任何人也都能删除别人的临时文件,那系统早就乱套了。有了Sticky位之后,即便目录对所有人开放写权限,普通用户也动不了别人创建的文件。这个设计在共享上传目录、共享缓存目录、多人协作的临时目录里都极其重要。
设置命令:
chmod +t /tmp # 或 chmod 1777 /tmp chmod -t /tmp # 去掉Sticky有一个值得强调的细节:Sticky位只影响“删除”和“重命名”,不影响“修改内容”。如果两个用户都对同一个文件有w权限,他们依然可以互相改写文件内容,只是不能把文件本身删掉或改名。
3.4 特殊权限位的设置与审计
三个特殊权限位的数字编码正好是SUID=4、SGID=2、Sticky=1,和普通权限组合在一个四位数字里。比如4755表示SUID+755,2775表示SGID+775,1777表示Sticky+777。下面这张表适合贴在手边:
| 特殊权限 | 数值位 | 文件上效果 | 目录上效果 | 常见场景 |
|---|---|---|---|---|
| SUID | 4 | 执行时euid变为文件属主 | 无实际意义 | 授权小工具提权 |
| SGID | 2 | 执行时egid变为文件属组 | 新文件自动继承目录属组 | 团队共享目录 |
| Sticky | 1 | 基本无意义 | 限制目录内删除他人文件 | /tmp、上传目录 |
对于安全审计,一条find命令就能把全系统的可疑特殊权限文件捞出来:
find / -perm -4000 -type f 2>/dev/null # 查找所有SUID文件 find / -perm -2000 -type f 2>/dev/null # 查找所有SGID文件 find / -perm -1000 -type d 2>/dev/null # 查找所有带Sticky的目录拿到清单之后逐项过一遍,凡是自己不认识、说不清用途的SUID/SGID文件,都值得警惕。我见过不少被植入后门的系统,攻击手段就是在某个目录里放一个带SUID的shell副本,用root执行一次之后,任何普通用户都能以root身份进入系统。所以定期跑这几条命令应该成为运维的基本习惯,而不是出了事才想起来查。
4. 当普通权限不够用:ACL与sudo的精细化权限实战
4.1 一个目录、三种角色,chmod开始力不从心
传统权限模型里,一个文件只能设置owner、group、other这三组权限,无法表达“给用户A读、给用户B写、给用户C读和执行”这种多层需求。除非你为每种角色单独建一个组,然后把用户塞进不同组里,否则就只能牺牲安全性,用777草草了事。
我举个例子:/data/share目录归某个项目组使用,项目经理需要读写,两个核心成员需要读写,一个实习生只允许查看,其他部门人员一律禁止访问。如果用传统方式,需要建一个“读写组”、一个“只读组”,还要保证组之间不互相覆盖,配置起来非常绕。而ACL(Access Control List,访问控制列表)就是为这种场景设计的,它允许你在传统权限之外,给任意指定用户或组单独分配权限。
ACL的意义不是取代chmod,而是给chmod做精细化补充。文件权限还是保留常规的owner和group设置,额外的授权条目全部记录在扩展属性里。这样既保留了传统权限模型的简单性,又能应对复杂授权需求。
4.2 setfacl/getfacl实战,以及mask是什么
ACL的核心命令是setfacl和getfacl。还是用上面的例子,假设目录属主是root,我要给alice和bob授予读写执行权限,给carl只读权限:
setfacl -m u:alice:rwx /data/share setfacl -m u:bob:rwx /data/share setfacl -m u:carl:r-x /data/share setfacl -m o::--- /data/share设置完成后用getfacl查看:
getfacl /data/share输出会显示类似这样的内容:
# file: /data/share # owner: root # group: root user::rwx user:alice:rwx user:bob:rwx user:carl:r-x group::r-x mask::rwx other::---这里有一个几乎所有新手都会踩的坑,就是mask。mask就像一把“权限上限锁”,它会限制所有命名用户和命名组的实际生效权限。比如上面输出里mask是rwx,alice的rwx能完整生效;如果执行setfacl -m m::r-x,把mask改成r-x,那么alice虽然条目里写的还是rwx,实际生效的就只有r-x了,w会被mask抑制掉。这个机制经常在多个ACL条目叠加时造成“权限明明设置了却不生效”的假象。
清除ACL的命令我也列出来:
setfacl -x u:alice /data/share # 删除alice的ACL条目 setfacl -b /data/share # 删除目录下所有ACL扩展条目注意setfacl -x只删除指定条目,setfacl -b才是全部清除。如果你需要对目录下所有已存在的文件也生效,记得加上-R递归参数,否则新规则只作用于目录本身。
4.3 sudo授权:从给密码变成给精确指令
如果说ACL解决的是“文件级权限”,sudo解决的是“命令级权限”。日常管理里最常见的危险操作就是图省事,把root密码直接告诉同事,或者给一个普通用户配了sudo ALL权限。这两种做法等于把服务器大门钥匙复制了一遍。正规的做法是只给用户授权他们确实需要的命令。
编辑sudo配置必须用visudo,这个命令的特别之处在于它会在保存前做语法检查,避免你写错一行导致sudo彻底瘫痪:
visudo典型的配置格式是:
用户名 主机=(可切换身份) 命令列表比如只允许用户deploy在任意主机上以root身份执行systemctl和tail命令,可以这样写:
deploy ALL=(root) /usr/bin/systemctl, /usr/bin/tail如果需要免密执行,在命令列表前加NOPASSWD即可:
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp这种白名单式授权的价值是双重的:对使用者来说,不需要为每次操作输入密码,体验顺畅;对管理者来说,即便用户的密码泄露,攻击者能执行的命令也局限在systemctl restart myapp这个单点上,破坏面被压缩得很小。
反过来,最该避免的是这种写法:
deploy ALL=(ALL) NOPASSWD: ALL它等于给了deploy一个“无密码root”,和把root密码公布没有本质区别。我在一些配置不规范的服务器上见过太多类似的条目了,一旦被利用,基本就是直接沦陷。
5. 一次“Permission denied”的完整排查链路
5.1 现象:脚本755,执行还是被拒
回到文章开头同事A的案例。某项目组反馈,部署服务器上的upload.sh无法执行,报错信息只有一行:
-bash: /src/project/upload.sh: Permission denied同事A第一反应是查看脚本权限,结果是-rwxr-xr-x,owner可以执行,group可以执行,other也可以执行,怎么看都不该有问题。他又检查了脚本属主,是root,自己执行也是以root身份,理论上更不该被拒。他甚至试过重新chmod 777,重新cp覆盖,问题依旧。这就是典型的“权限看起来没问题,但系统就是不让你碰”的场景。
5.2 排查顺序:文件、目录、父目录、ACL、文件系统
遇到这种问题,我的排查顺序很固定:先查文件自身,再逐级向上查目录,然后再看ACL和文件系统挂载选项。具体来说:
# 1. 查看文件自身权限和属主 ls -l /src/project/upload.sh stat /src/project/upload.sh # 2. 查看所在目录权限 ls -ld /src/project # 3. 逐级向上查看所有父目录 ls -ld /src ls -ld / # 4. 查看ACL扩展权限 getfacl /src/project/upload.sh # 5. 查看文件系统挂载选项 findmnt /src逐级排查时我发现,/src目录的权限是drwxr--r--。注意看这个权限组合:目录owner是rwx,没问题;group是r--,只能读列表,没有x执行权限;other也是r--。而执行upload.sh时需要经过/src和/src/project两级目录,/src/project的权限正常,恰恰是/src这层拦截了所有非owner用户。
于是结论浮出水面。脚本在/src/project下,但/src目录没有给其他用户x权限,所以即使脚本文件本身是755,那也只是“文件层”的权限;系统访问文件时,连/src这一层的目录都穿不过去,自然到不了脚本面前。Permission denied其实是目录权限拦截,不是文件权限拦截。
5.3 namei -l:一条命令看清整条路径的权限
上面这套排查逻辑写出来是几行命令,但实际执行时有一个更快的手段:namei命令。它能一口气输出路径上每一层目录和文件的权限,格式非常直观:
namei -l /src/project/upload.sh输出大概是这样的:
f: /src/project/upload.sh drwxr-xr-x root root / drwxr--r-- root root src drwxr-xr-x root root project -rwxr-xr-x root root upload.sh一眼就能看到src这一层的权限只有drwxr--r--,group和other缺x。整个排查过程从“怀疑脚本”变成“看到src目录就明白原因”,不到十秒。namei是我排查路径权限问题时最常用的工具,它把系统内部那段逐级检查目录权限的过程完整暴露在眼前。
5.4 复盘:这个坑为什么反复出现,以及通用排查清单
复盘这个案例,根因是某次调整目录权限时,管理员误把/src的权限从755改成了744,本意是“不让其他人乱动根目录下的东西”,结果连带剥夺了普通用户和同组用户穿越目录的权限。这种问题之所以反复出现,是因为“目录r权限能看到名字”和“目录x权限能访问内容”这两个概念在大多数人脑子里是混在一起的,改权限时只考虑了“能不能看到列表”,完全忘了还要给x。
这里给出一个通用排查清单,以后遇到任何Permission denied都可以按顺序过一遍:
- 用ls -l或stat确认文件自身的权限、属主、属组。
- 用namei -l确认整条路径每一级目录的权限,重点看x是否到位。
- 用getfacl检查是否有ACL条目干扰,特别留意mask上限。
- 用getenforce和ls -Z检查SELinux是否拦截,以及文件的安全上下文是否正确。
- 用findmnt检查挂载选项,确认目录没有被noexec、nosuid这类选项限制。
这套顺序从最基础的文件权限查起,到目录权限、ACL、SELinux、挂载选项,覆盖了绝大多数权限类故障。学会这个顺序之后,Permission denied就不再是玄学,而是一个有固定流程可循的工程问题。
6. 把权限管理做成习惯:日常操作、验证工具与定期审计
6.1 建用户建组时就规划好权限模型
权限管理做得好不好,往往在建号建组那一刻就已经决定了。我在新服务器上创建用户时,始终坚持这几条:用户用useradd创建并指定主组,而不是直接编辑/etc/passwd;需要共享文件的人群统一放进一个业务组,比如project_team;最多只给用户必要的辅助组,用usermod -aG添加,避免覆盖已有组列表。
举个最基础的命令序列,比如创建一个运维用户并加入ops组:
groupadd ops useradd -m -G ops -s /bin/bash opsadmin然后给共享目录设置合理的属组和权限:
chown root:ops /srv/ops chmod 2770 /srv/ops2770这个权限表示:目录属主root可以完全访问,ops组可以完全访问,其他用户被拒绝,并且开启SGID让新建文件自动继承ops组。这样后续所有加入ops组的人都能正常协作,而没有被授权的人连目录都进不去。权限模型在最初就定好,比出了事再去追查要省太多精力。
6.2 验证权限的三件套:stat、getfacl、namei
设置完权限不等于结束,验证才是关键。我平时验证权限主要用三个工具,各有分工。
stat适合快速看一个文件或目录的数字权限和属主,命令是stat -c "%a %U:%G %n" target,输出比如644 root:root note.txt,一眼就能知道权限是否符合预期。
getfacl专门用来查看ACL条目,尤其是设置了多条用户规则和mask之后,它能完整显示所有生效的权限矩阵,避免你只看到ls -l的粗粒度信息就误判。
namei前面讲过,是用来排查路径权限的利器。当一个文件死活访问不了、又不知道是哪级目录拦截时,一条namei -l直接把路径上每一层的权限列出来,问题定位基本就是秒级。
这三个工具配合起来,既能验证“权限设置对了”,也能验证“路径上所有环节都畅通”。不要小看这一步,很多配置遗漏,比如给文件设了权限却忘了级联设置父目录,都是靠验证这一步才暴露出来的。
6.3 定期审计:找到不该存在的SUID与全局可写文件
权限管理的另一个刚需是定期审计。系统跑得越久,越容易出现权限被改乱、被遗忘的情况。至少每月做一次全系统特权权限扫描,我已经把下面几条命令写成了定时任务:
find / -perm -4000 -type f 2>/dev/null > /var/log/suid.list find / -perm -2000 -type f 2>/dev/null >> /var/log/sgid.list find / -perm -0002 -type f 2>/dev/null >> /var/log/world_writable.list查看这些文件列表,逐项确认是否仍然需要特权。凡是说不清用途的SUID文件全部去掉s位,凡是全局可写且不属于/tmp、/var/tmp之类的文件全部收权限。这个动作看起来很基础,却是防止提权类攻击最有效的手段之一。
还有一个常被忽视的审计点是挂载选项。比如有需求的目录可以用noexec、nosuid、nodev这些选项来收紧,从文件系统层面把“可执行”“可提权”的通道直接堵死。这类审计不复杂,但能显著降低安全暴露面。
6.4 我踩过几次坑之后养成的三个小习惯
最后分享三个我在实际运维中形成的习惯,都是踩过坑之后总结出来的。
第一,改权限前先记录原权限。无论执行什么chmod、chown、setfacl,先用stat或getfacl把当前状态保存一份,改完再对比一次。别小看这一步,它能让你在误操作后十几秒内恢复现场,而不是花半小时回忆“原来到底是什么权限”。
第二,能用符号模式就不用数字模式。交互式操作时,chmod u+x这种增量修改比chmod 755安全得多,因为它只动一个位,不会顺手把其他权限重置掉。需要精确控制某个完整权限时,再用数字模式。
第三,排查权限问题优先用namei而不是猜。很多人一遇到Permission denied就反复看文件权限,这很容易被文件层的表象带偏。先跑一条namei -l,把整条路径的权限链路完完整整看一遍,大概率一眼就能找到问题所在。真正的高手不是权限命令记得多,而是在问题发生时能快速定位到“到底是谁挡了路”。