Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密

0 阅读7分钟

作为 Linux 使用者或者学习者,你肯定无数次敲过ls -l看文件信息,也听人说过脚本要设chmod 755才安全,但你真的懂这些字符和数字背后的逻辑嘛?其实 Linux 文件权限是系统安全的基石,如果连这个都没搞懂,那连Linux的门都没有摸到,至少只有搞懂这个,才算真正摸到了 Linux 安全的门槛。

一、先搞懂ls -l输出的那 10 个神秘字符

运行ls -l时,我们通常会看到如下图所示类似的显示: image.png 输出第一列的 10 位字符如-rw-r--r--是什么意思呢? 这就是文件权限的全部信息,咱们结合下面这张拆解图来一个个说: Linux文件权限完全图解-Linux文件权限拆解.drawio.png

  • 第 1 位:这是文件类型标识,-代表普通文件,d代表目录,l是软链接,还有c字符设备、b块设备这些特殊类型,不过日常用得最多的还是前三个。
  • 第 2-4 位:这是文件所有者的权限,也就是创建这个文件的用户(或者被chown指定的用户)能做什么。
  • 第 5-7 位:这是文件所属组的权限,同一组里的所有用户都适用这套权限。
  • 第 8-10 位:这是其他人的权限,也就是既不是所有者、也不在所属组里的所有用户的权限。 而每一组的 3 个字符,顺序固定是rwx—— 分别对应读(read)、写(write)、执行(execute),没有的权限就用-占位。比如-r-x就表示有读和执行权限,但没有写权限。 举个实际例子,比如你看到drwxr-xr-x,翻译过来就是:
  • 这是一个目录;
  • 所有者有读、写、执行全部权限;
  • 所属组和其他人都只有读和执行权限,没有写权限。

这里要特别注意一下,目录的x权限特别关键 —— 没有它你连cd进这个目录都做不到,哪怕给了r权限也只能看到文件名,看不了详细信息。

二、在搞懂数字权限,为什么大家偏爱chmod 755

除了用rwx的字符表示权限,Linux 还支持用数字来快速设置,这就是你常听到的 755、644 这些数字的由来。其实这是用二进制位表示权限位转化成十进制的一种表示方式。其实逻辑很简单:每一个权限对应一个固定数值,r=4w=2x=1,没有权限就是 0,把一组的三个权限数值加起来,就得到了 0-7 之间的一个数字。 Linux文件权限完全图解-Linux文件数字权限和字符权限对应表.drawio.png 比如:

  • rwx就是 4+2+1=7,代表全权限
  • rw-是 4+2+0=6,代表可读可写但不可执行
  • r-x是 4+0+1=5,代表可读可执行但不可写
  • r--是 4+0+0=4,代表只有读权限 这样一来,三组权限就对应三个数字,组合起来就是我们熟悉的权限码了。比如chmod 755 filename,就是给所有者设 7(rwx),所属组和其他人都设 5(r-x),对应字符权限就是-rwxr-xr-x,这也是脚本文件的标准权限 —— 既能让所有人运行,又不让别人随便修改,符合最小权限原则。 那chmod除了数字法,还有符号法可以微调权限,比如你只想给所有者加个执行权限,就用chmod u+x filename;想去掉所属组的写权限,就用chmod g-w filename。符号法的好处是不用记全权限,只改你需要的部分,适合小范围调整。

三、最容易被忽略的特殊权限

除了基础的 rwx,Linux 还有三个特殊权限: SUID、SGID、Sticky Bit,它们是权限系统的补充,也是一些核心功能能正常工作的关键。

  • SUID(数字 4):只对可执行文件有效,当用户运行这个文件时,会以文件所有者的身份执行。最典型的例子就是/usr/bin/passwd,它的权限是-rwsr-xr-x(也就是 4755),普通用户本来没权限修改/etc/shadow密码文件,但因为 SUID 的存在,运行passwd时会临时获得 root 权限,才能完成密码修改。
  • SGID(数字 2):对文件和目录都有效。对可执行文件来说,和 SUID 类似,运行时会以所属组的身份执行;对目录来说,在这个目录下新建的文件会自动继承目录的所属组,这在多人协作的场景里非常实用,比如团队共享目录,不用每次新建文件都手动改组。
  • Sticky Bit(数字 1):只对目录有效,最典型的就是/tmp目录,它的权限是drwxrwxrwt(也就是 1777)。有了 Sticky Bit,哪怕目录给了所有人写权限,用户也只能删除自己创建的文件,删不了别人的,完美解决了公共目录的文件混乱问题。

这里要注意下,如果给没有执行权限的文件设 SUID/SGID,权限位会显示大写的S,这时候这个特殊权限是无效的,只有当执行位(x)开启时,才会显示小写的s,权限才会生效。

Linux文件权限完全图解-Linux文件特殊权限示意图.drawio.png

四、权限检查的底层运行逻辑

有了前面的权限设计,那系统到底怎么判断你能不能操作某个文件呢?其实 Linux 判断用户能否操作一个文件,是有固定顺序的,而且是匹配到就停止,不会叠加权限:

  1. 先检查你是不是这个文件的所有者,如果是,就完全按照所有者的权限来判断,不管组和其他人的权限;
  2. 如果你不是所有者,就检查你是不是在文件的所属组里,如果是,就用组权限来判断;
  3. 前两个都不匹配,才会用到其他人的权限。 还有个细节:其实Linux 不认用户名,只认 UID 和 GID 的数值。比如你把文件所有者改成testuser,其实是把文件的 UID 字段改成了testuser对应的数字 ID,用户加入新组后,得重新登录或者用newgrp切换,新组的权限才会生效。

最后再提一句默认权限的问题,你有没有发现新建文件默认是 644,新建目录默认是 755?这是因为系统有个umask掩码,普通用户默认是 0002,root 用户默认是 0022。 新建文件的基础权限是 666,减去 umask 的后三位 002,就得到 644;目录的基础权限是 777,减去 002 就得到 755。如果需要临时改默认权限,直接敲umask 027就行,要是想永久生效,就改/etc/bashrc或者家目录下的.bashrc文件,当然了,改系统文件之前最好先备份一下。

不算总结的总结

Linux 文件权限看起来简单,对很多同学来说可能多多少少知道rwx和755这些,但是其实很多人也说不清楚原理。Linux 文件权限要说复杂也不复杂,其实核心就是三个用户组(所有者、所属组、其他人)+ 三个基础权限(rwx),再加上三个特殊权限做补充。搞懂ls -l的输出逻辑,会用chmod的数字和符号两种方式,再理解权限检查的顺序,你就能轻松应对日常的权限管理了,这可是 Linux 安全的基本功,一定要练扎实哦。最后提个醒,日常操作记得遵循最小权限原则 —— 给用户和文件的权限,刚好够用就行,别给多了,这样才能大大降低系统的安全风险。

==最后,如果内容对您有帮助,麻烦动动手指给个点赞、收藏、关注==