一文彻底看懂Linux权限底层逻辑
一文彻底看懂Linux权限底层逻辑
ZhangCurry别再无脑 chmod 777 了!一文彻底看懂 Linux 权限底层逻辑
刚从 Windows 转到 Linux 的朋友,大概都遇见过这个灵魂拷问:为什么我明明是电脑的主人,删个文件还说我权限不够?这个 -rwxr-xr-x 到底是一串什么密码?为什么分三组?r、w、x又各代表啥?
更神奇的是,很多人用了好几年 Linux,背都背下来 r=4、w=2、x=1,给文件改权限的时候张口就是 chmod 755,但真要问一句“为什么 755 就是最高可读可执行?rwx 对应文件和文件夹居然不是一个意思?”,瞬间就卡壳了。
还有人会纳闷:同样是操作系统,Windows 里我开程序点一下“以管理员身份运行”就完事了,怎么 Linux 权限搞得这么麻烦,动不动就 Permission denied,是不是设计得太反人类了?
今天咱们就把 Linux 里这个最基础,也最容易搞混的 rwx 权限说透。看完你不仅能明白每个字符是什么意思,还能搞懂——为什么 Linux 的权限设计,就是比 Windows 管理员权限那套更严格,更安全。
一、 先搞懂:Linux 里“一切皆文件”,权限是给文件挂的锁
说权限之前,得先讲明白 Linux 的一个核心设计思想:一切皆文件。
不管你是普通的文本文档、图片、程序,还是硬盘、U盘、甚至你鼠标键盘这个硬件,在 Linux 眼里全都是“文件”,都存在文件系统的目录树里,统一管理。那既然所有东西都是文件,自然所有东西都要加权限控制——你不能随便让一个普通用户摸硬件,也不能让一个程序随便改系统配置文件对吧?
而 Windows 其实也有权限,但设计思路不一样:Windows 更偏向“用户身份”,默认给你开管理员账户,你装个软件弹个UAC问你要不要允许,点完就完事,大部分时候用户感知不到权限的存在。
Linux 从根上就是多用户设计——从诞生之初就是给多个人同时用的服务器,天生就得搞清楚“谁能碰哪个文件”,所以权限从根上就嵌进了文件系统里,每个文件都必须带权限,半点含糊不得。
那每个文件的权限长啥样?你随便打开 Linux 终端,输入 ls -l,出来的第一列就是权限信息,大概长这样:
1 | -rwxr-xr-x 1 root root 12M 8月 1 12:00 myapp |
很多新手第一眼就懵了:这一串横杠字母,到底怎么拆?其实特别简单,我们把它拆成四段看:第一个字符是文件类型,后面9个字符分成三组,正好对应三类用户的权限。画个图就是这样:
| 第1位 | 第2-4位 | 第5-7位 | 第8-10位 |
|---|---|---|---|
| 文件类型 | 文件所有者(Owner)的权限 | 文件所属组(Group)的权限 | 其他用户(Others)的权限 |
就拿刚才的 -rwxr-xr-x 举例:
- 第一个是
-**:代表这是一个普通文件(如果是d就是文件夹,l就是软链接,b就是块设备,这个我们今天不展开,记下来d是目录就行)。 - 接下来 2-4 位是
rwx**:这个文件的所有者,拥有读(read)、写(write)、执行(execute)三个权限。 - 5-7 位是
r-x**:这个文件所属组里的用户,只有读和执行权限,没有写权限。 - 8-10 位是
r-x**:既不是所有者,也不在所属组里的其他用户,同样只有读和执行权限,不能改。
小结一下:9个字符分三组,每组三个,每个位置对应一个权限,没有这个权限就用
-占位,就这么简单!那现在问题来了,r、w、x三个字母,到底分别代表啥?
二、 核心误区:rwx对文件和目录,完全是两个意思!
90%的新手,甚至用了一两年 Linux 的人,都栽在这个坑里:以为 rwx 不管对文件还是目录,都是一个意思,其实根本不是!我们分开讲,保证你一次记牢。
1. 文件的 rwx:最容易理解的情况
首先,我们说一个普通文件(就是存数据的那种,比如 txt、二进制程序、配置文件),rwx 分别是什么:
- r (read) 读权限**:意思就是你能不能读取这个文件的内容——比如你用
cat看文件内容,用vim读文件,都需要 r 权限。没有 r 权限你连内容都看不了。 - w (write) 写权限**:意思就是你能不能修改这个文件的内容——你编辑保存、删除内容、新增内容,都需要 w 权限。
- x (execute) 执行权限**:这个是文件特有的,意思就是你能不能把这个文件当做程序运行。比如你下载了一个二进制程序,或者写了一个 bash 脚本,不给 x 权限你根本跑不起来,哪怕你能读能写也没用——系统不信你这是个可执行的东西。
这就很好理解对吧?比如你写了一个 hello.sh 脚本,存到电脑里,默认是没有 x 权限的,所以你直接敲 ./hello.sh,系统会直接给你甩一个 Permission denied,你得先 chmod +x hello.sh 加上执行权限才能跑,就是这个道理。
2. 目录的 rwx:每个权限的作用你绝对想不到
目录在 Linux 里其实也是一种特殊的文件,它存的不是别的,是这个目录下面所有文件和子目录的“名字列表+索引”,所以 rwx 对应的权限完全不一样:
① 目录的 r 权限:你能不能列出目录里有什么东西
对目录来说,读权限 r 不是让你读目录里文件的内容,是让你读这个目录里的文件列表。比如你敲 ls /home/test,如果 /home/test 这个目录不给你 r 权限,你直接 ls 就会报错:ls: cannot open directory '/home/test': Permission denied,列表都读不出来,自然你也就不知道里面有啥文件。
那有意思的来了:如果我没有目录的 r 权限,但是我已经知道里面有个叫 a.txt 的文件,我也有 a.txt 的 r 权限,我能不能读 a.txt 的内容?答案是:可以!
因为 r 权限只是不让你列列表,但是你都知道文件名了,直接读文件本身,只要文件本身给你权限就行。举个实际的例子你就懂了:
1 | # 我们建一个测试目录,权限设为711(只有所有者有所有权限) |
惊不惊喜?意不意外?目录没 r 权限只是不让你列文件,不耽误你知道文件名之后直接读文件——很多CTF的题目就是考这个点,老手也经常记错,今天你记住了吧?
② 目录的 w 权限:你能不能在目录里增删改文件!
这个是第二个大坑:很多人以为,我要删一个文件,需要文件本身的 w 权限?不对!删文件的权限,根本不在文件上,在文件所在的父目录上!
为什么?还是那句话,文件的名字和位置存在父目录的索引表里啊!你把文件删掉,本质是把这个文件的名字从父目录的索引表里删掉,这不就是改父目录的内容吗?所以改父目录当然需要父目录的 w 权限啊!
我们还是拿刚才的例子做实验,你一看就懂:
1 | # 现在我们改一下权限:父目录testdir给其他用户r-x权限(也就是有读和执行,没写) |
哎?奇怪啊,文件我明明有 w 权限啊,为什么删不掉?因为父目录我没有 w 权限啊!我改不了父目录的索引表,当然删不掉!那如果反过来呢?
1 | # 改回去:父目录给777(所有用户都有写权限),文件本身给444(只读,任何人都不能写) |
我靠,文件我都没写权限,居然能删掉?!对!就是能删掉!因为删文件是改父目录,不需要改文件本身,只要父目录给你 w 权限就行,文件有没有 w 权限根本不耽误你删它。
这个点真的太重要了,很多新手在服务器上碰到“为什么我有权限改文件删不了”“为什么只读文件我还能删掉”,问题全出在这里——你得去看父目录的权限,不是看文件本身。
那目录 w 权限除了删文件,还能干啥?你新建文件、新建子目录、重命名文件,本质都是改父目录的索引表,所以都需要目录的 w 权限。记牢这句话:增删改目录里的文件名,都要目录的 w 权限,和文件本身权限无关。
③ 目录的 x 权限:你能不能进入目录,访问目录里的文件
最后一个最容易搞混的 x 权限——目录的 x 到底是啥?能执行目录?目录又不是程序,执行个啥?
其实目录的 x 权限,翻译成人话就是:你能不能“进入”这个目录,能不能访问目录里面的文件和子目录。
我们还是拿例子说,如果你对一个目录只有 r 权限,没有 x 权限,会发生什么?
1 | # 建个测试目录,权限设成r--,也就是给其他用户读权限,不给执行权限 |
现在你切到普通用户,先试试 ls 列目录:
1 | ls testdir2 |
哎,能列出文件啊,因为我们给了 r 权限对不对?那你试试 cd 进去呢?
1 | cd testdir2 |
进不去!那你试试直接 cat 里面的 a.txt 呢?
1 | cat testdir2/a.txt |
怎么回事?我都能 ls 出 a.txt 了,怎么还读不了?因为 x 权限没开啊!
为什么?你要访问目录里的任何一个文件,系统都要帮你解析路径,从 / 开始一层层找,找到 testdir2,再找 a.txt,找到 testdir2 的时候,发现你没有 x 权限,系统直接就拒绝你往下走了,哪怕你知道文件名,哪怕你能列出来,也进不去访问不了。
哦!原来 x 权限是目录的“通行证”啊!对!就是这个意思——x 权限就是让你能够通过这个目录,访问到里面更深的文件,没有 x,你连进都进不去。
💡 目录权限核心总结:
- 目录 r:能不能看目录里有啥文件(ls能用)。* 目录 w:能不能在目录里增删改文件名(删文件要这个,不是文件的w)。* 目录 x:能不能进入目录、访问目录里的文件(cd和路径解析要这个)。
现在我们再回头说那个常见的数字权限,比如 755、644 是什么意思,你一下就懂了:r 是 4,w 是 2,x 是 1,三个数加起来就是每组的权限。
比如 755 拆分:三组分别是 7、5、5
- 7=4+2+1 → rwx → 所有者有所有权限。
- 5=4+1 → r-x → 组用户和其他用户有读和执行,没有写。
- 如果是目录,就是:所有者可以增删改里面的文件,其他人只能看和进,不能改;如果是文件,就是所有者能改能运行,其他人只能看和运行,不能改。
再比如 644:6=4+2 → rw-,4 就是 r–,所以文件所有者能读写,其他人只能读,不能改也不能运行——这就是普通文本文件最常用的权限。
是不是一下就通透了?以前背数字,现在你知道数字背后到底代表什么权限了对不对?
三、 为什么 Linux 权限比 Windows 的管理员权限更严格?
讲完 rwx 是什么,我们回到最开始的问题:同样是操作系统,为什么 Linux 权限这么啰嗦,还比 Windows 的管理员权限严格?这得从两者的设计初心说起。
首先,Windows 从一开始就是个人用的桌面系统,哪怕现在的服务器版 Windows,设计思路也是围绕“单个用户用电脑”,所以默认给你管理员身份。你说你是管理员,那你基本上就能干所有事,UAC 弹窗只是提醒你一下,点个确定就全放开了。而且 Windows 的权限设计,更多是“隔离不同用户”,普通用户不能改系统文件,你提升成管理员就可以了,权限是跟着身份走的,你身份是管理员,所有资源你都能碰。
但 Linux 不一样,Linux 从诞生就是多用户的服务器系统,讲究的是最小权限原则——什么叫最小权限?就是“你只需要拥有能完成你工作的权限就行,多一点都不给你”,哪怕你是 root,你平时操作也用普通用户,需要权限的时候再 su 或者 sudo 提权,目的就是怕你不小心误操作,也怕程序漏洞跑了之后搞破坏。
那 Linux 的权限设计到底严格在哪?我们说三个核心点:
1. 权限绑在每个文件上,不是只绑在用户身份上
刚才我们说了,Linux 每个文件天生带权限,哪怕你是同一个用户的不同程序,只要文件权限不对,你也碰不了。比如你跑一个 web 服务,一般我们会给它开一个单独的 www-data 用户,这个用户只能读 web 目录的文件,不能改系统配置,也不能碰其他用户的文件。哪怕 web 服务被人攻破了,攻击者也拿不到系统权限,因为 www-data 本身就没权限。
放到 Windows 里呢?你开个 web 服务,一般默认都是用管理员身份跑,攻破了直接拿服务器最高权限,整个系统都没了。不是说 Windows 做不到权限分离,是默认不这么干,设计理念就不一样,普通用户也感知不到,大部分人用 Windows 就是一直用管理员,根本没概念。
2. 三类用户分开控制,粒度更细
Linux 的 rwx 给了三类用户:所有者、所属组、其他人,这个粒度真的太实用了。比如我们做开发,服务器上有多个开发人员,都在同一个 dev 组里,我写的代码,我自己是所有者,有读写权限,同组的人也能读能改,但是线上的其他用户,比如 web 服务的用户,只能读不能改——这不就是一个 rwx 就能搞定的事吗?直接设成 rwxrwxr–,也就是 774,完事了,对不对?
再比如,你有一个文件夹,只想让你自己用,不想让别人碰,直接设成 700,其他用户连列都列不出来,完美,不需要搞什么复杂的 ACL,默认就支持。
Windows 呢?Windows 虽然也有精细的权限和低权限运行机制,但其配置界面(ACL 列表)极为繁琐,导致很多管理员为了图省事直接用 Administrator 跑服务。
3. 特殊权限机制,比管理员更灵活
除了基础的 rwx,Linux 还有 SUID、SGID、粘滞位这些特殊权限,能实现很多 Windows 做不到的精细控制。比如最常见的 passwd 命令,你普通用户要改自己的密码,得改 /etc/shadow 文件对吧?这个文件只有 root 能写,那普通用户怎么改?
就是靠 SUID:给 passwd 命令加上 SUID 权限,这样不管谁运行 passwd,该运行进程都会以文件所有者(也就是 root)的身份去执行,从而有权修改 shadow 文件,改完就结束了,权限收回去,你普通用户也不能直接改 shadow,只能通过 passwd 这个程序改。完美解决了“普通用户要改只有 root 能写的文件”的问题,既满足了需求,又没放开权限,这个设计多巧啊?
再举个大家每天都用的例子:/tmp 目录,所有人都能读写,但是你只能删你自己的文件,不能删别人的,怎么实现?就是靠粘滞位:给 /tmp 加上粘滞位之后,哪怕你对这个目录有 w 权限,你也只能删你自己是所有者的文件,root 和所有者才能删,其他人哪怕同组也删不了。你想想,如果没有这个设计,/tmp 所有人都能写,那不是随便一个用户就能把别人的临时文件删掉了?这就是权限控制的精妙之处。
还有一点很关键:Linux 默认普通用户根本就没有 root 权限,哪怕你是电脑的所有者,你平时登录用的也是普通用户,要干 root 才能干的事,必须得加 sudo,输密码认证,这本身就是一种严格的控制。你不可能不小心敲个 rm -rf / 把系统删了,因为普通用户根本没这个权限,大部分系统文件你碰都碰不了。
四、 常见的坑:你碰到的 Permission denied,90%都是这些问题
讲完了原理,我们来聊聊新手最常碰到的权限问题,看完你下次碰到错误直接就能定位,不用瞎猜了:
坑1:删文件提示权限不够,找父目录,别找文件
删文件要的是父目录的 w 权限,不是文件本身的。所以你碰到删不了文件,先别急着 chmod 777 文件,先去 ls -ld 看看父目录的权限,是不是当前用户没有写权限?比如很多人把代码放到 /usr/local/nginx/html 里,这个目录默认是 root 建的,权限是 755,你普通用户想删里面的文件,当然删不了。这时候你要么用 sudo 删,要么改目录的所有者,瞎改文件权限没用。
坑2:能访问网站但是打不开目录,找目录的 x 权限
很多人搭 web 服务,改了目录权限,打开网站提示 403 Forbidden。大概率是目录没给 x 权限——你想想,nginx 要访问目录里的文件,得解析路径,解析路径需要目录的 x 权限啊!你给目录设成了 644,nginx 根本进不去,当然 403 了。记住:Linux 下所有目录默认至少得给 x 权限。
-
坑3:脚本能读,但是跑不起来,找文件的 x 权限
你写了一个 shell 脚本,cat 能打开,就是 ./xxx.sh 跑不起来,提示 Permission denied。别慌,就是忘了加执行权限了,chmod +x xxx.sh 加完就能跑了。
-
坑4:为什么我改了权限还是访问不了?看看上级目录权限
有时候你明明给了当前文件和目录权限,还是访问不了,往上翻一层看看,是不是上级目录就没给 x 权限?路径解析是从根开始一层一层过的,只要中间有一层目录没 x 权限,直接就给你拦住了。
坑5:别动不动就 chmod 777,这是给黑客留门
很多新手碰到权限问题,上来就 chmod -R 777 /,什么问题都解决了,但是安全问题也来了。777 意味着所有用户都能读写执行这个文件,要是你的服务器上有个可执行文件是 777,攻击者随便就能改了给你种个木马。遵循最小权限原则,多余的权限一律不给,才是安全的用法。
五、 总结:rwx不只是规则,是Linux安全的根
我们今天从头捋了一遍,从 rwx 的拆分,到文件和目录不同的含义,再到为什么 Linux 权限比 Windows 严格,相信你现在对这个最基础的概念已经完全通透了吧?
最后我们再把核心点总结一遍,方便你记忆:
ls -l 出来的第一串字符,第一位是文件类型,后面9位分三组,依次是所有者、所属组、其他用户的权限,每个位置 r读、w写、x执行,没有就是 -。
- 对文件来说:r=读内容,w=改内容,x=运行程序。
- 对目录来说:r=列文件列表,w=增删改文件名(删文件要这个!),x=进入目录访问文件(通行证!)。
- r=4,w=2,x=1,每组的数字加起来就是权限数字,比如 7=4+2+1=rwx,5=4+1=r-x。
- Linux从根上就是多用户设计,遵循最小权限原则,每个文件都有权限,粒度比 Windows 细得多,默认就严格控制权限,所以天生就比 Windows 那套管理员权限更安全。
其实很多人用了很多年 Linux,都没认真搞懂 rwx 到底是什么,每次改权限都是靠蒙,照着教程输 755,出了问题就瞎改 777。其实只要搞懂了底层原理,碰到问题一下就能定位。
最后留个问题考考你:你最近一次碰到 Permission denied 是因为啥?是父目录没 w 权限?还是目录没 x 权限?欢迎在评论区留言分享你的踩坑经历,我们一起交流~



