DevKitLab Logo DevKitLab
chmod / Unix / 文件权限 / Linux

chmod 755 到底是什么意思?(顺便学会读懂任意权限)

755 那三个数字不是魔法,而是一套「谁能读、能写、能执行」的编码。这篇带你一眼读懂 755、644、700,并讲清执行位在目录上为什么是另一个意思。

从 Stack Overflow 抄来那行 chmod 755 deploy.sh,跑通了。可 755 就是三个没头没脑的数字,等下次脚本跑不起来、或者网页服务器回你一个 403,你又只能对着数字碰运气。好消息是:这三个数字不是什么咒语,而是一套一眼就能读的编码。读懂之后,755644700 就不再是照抄的数字,而是你自己做的决定。

三类用户,三种权限

Unix 里每个文件和目录,都为三类用户各记一份权限:

  • 属主u)——通常是创建它的人
  • 属组g)——一组共享访问权的用户
  • 其他人o)——除此之外的所有人

每一类都有三种权限,各自独立地开或关:

  • 读(r——查看内容
  • 写(w——修改内容
  • 执行(x——把它当程序运行(在目录上是另一个意思,先记住这句)

敲一句 ls -l,这些一次全摆在你面前:

-rwxr-xr-x  1 alice  devs  482 Jul 29 09:14 deploy.sh

那串 -rwxr-xr-x 就是完整的权限集。从第一个字符之后,按每三个一组来读:

  • 开头的 -文件类型,不是权限(- 普通文件、d 目录、l 符号链接)——这一位最容易被误读
  • rwx——属主可读、可写、可执行
  • r-x——属组可读、可执行,但不能写
  • r-x——其他人一样:可读、可执行,不能写

短横 - 表示这一位是关的。所以 -rwxr-xr-x 正是 chmod 755 的产物——不过这是普通文件的样子;同样权限落在目录上会显示成 drwxr-xr-x,开头那位是 d 而不是 -。下面就看它是怎么来的。

每一位都是一个和:4、2、1

755 这三位,按顺序对应三类用户——属主、属组、其他人。每一位把该类的三种权限,用固定的数值相加编码出来:

权限数值
读(r4
写(w2
执行(x1

把你想开的权限对应的数值加起来,就得到一位 0 到 7 之间的数字:

数字相加权限
74 + 2 + 1rwx
64 + 2rw-
54 + 1r-x
44r--
0---

于是 755 从左到右就是:

  • 7 → 属主:4 + 2 + 1 = rwx
  • 5 → 属组:4 + 1 = r-x
  • 5 → 其他人:4 + 1 = r-x

属主什么都能做;属组和其他人能读、能执行,但改不了。这就是 chmod 755。再看 644

  • 6 → 属主:4 + 2 = rw-
  • 4 → 属组:r--
  • 4 → 其他人:r--

属主可读可写,其他人只能读。谁都没有执行位——这对一个普通数据文件恰到好处,对一个你要跑的脚本却恰恰是错的。

那些组合根本不用背。在 Chmod 权限计算器 里为每一类勾选读、写、执行,八进制和 rwxr-xr-x 字符串会同步变,勾几次这套对应关系就成了肌肉记忆。

你真正会碰到的那几个模式

常见的就那么几个数字,覆盖了大部分场景。它们各自的含义和用武之地如下;至于某个具体文件该给哪一个、整个项目目录又该怎么批量处理,chmod 644 和 755 怎么选专门拆解了这个决定:

八进制符号典型用途
644rw-r--r--普通文件——文档、配置、源码
755rwxr-xr-x目录,以及任何人都可运行的脚本或程序
700rwx------私有目录或脚本——只有属主
600rw-------私有文件——SSH 私钥就该是这个
750rwxr-x---属主全开,属组可用,其他人挡在外面
775rwxrwxr-x属组也能写——共享的项目目录

两条规律就能解释这张表的大半。数据文件用 644(私有时 600):属主读写,其他人只读或什么都没有,没有执行位。要遍历或要运行的东西——目录和程序——用 755(想收窄就 750/700):跟 644 一个思路,再加上执行位,因为少了执行位,它们存在的意义就没了。这就引出了大多数教程会跳过的那个问题。

执行位在目录上是另一回事

对文件,x 很直白:允许把它当程序跑。对目录,x 跟「运行」毫无关系——想通这一点,755 落在文件夹上才说得通。

在目录上:

  • r 让你列出里面的名字(ls
  • x 让你进入这个目录——cd 进去、穿过它,并按一个你已经知道的名字去访问文件
  • w——但必须和 x 一起——才让你创建、重命名、删除条目

意外之处在于 rx 有多么互不相干。一个只有 r 没有 x 的目录,你能看到文件名,却读不了文件本身,连 stat 都不行。一个只有 x 没有 r 的目录,你能打开里面的文件——前提是你已经知道确切的名字——但 ls 会失败。而改动目录里的东西,也就是新建或删除一个文件,需要在这个目录上同时有 wx,跟文件本身的权限无关。实际用起来,你总是希望 rx 一起有——这就是别人需要穿过的目录通常是 755 而不是 644 的原因:去掉执行位,谁也进不了这个文件夹。

还有一个很常见、第一次排查时容易忽略的连带效应:要访问 /var/www/site/index.html,你需要在路径上每一级目录都有 x——//var/var/www/var/www/site。只要有一级祖先目录缺了执行位,它底下的一切就都访问不到,哪怕文件本身开得再大方也没用。想一次看清整条链,可以敲 ls -ld / /var /var/www /var/www/site,挨行找哪一行少了 x。这是很多「盯着文件本身怎么都想不通」的 permission denied 的常见成因——一个看着没错却仍被拒绝的权限,值得单开一轮排查,chmod 之后仍然 Permission denied 就是按层排查的那一篇。

符号写法:换一种说法

八进制一次性把九个位全设了。符号写法只改动其中特定几个,读起来更像一句话:

chmod +x deploy.sh        # 加执行位,让它能跑(但看下面这条 umask 提醒)
chmod u+x deploy.sh       # 只给属主加执行位,其余原封不动
chmod go-w file           # 去掉属组和其他人的写权限
chmod u=rw,go=r file      # 精确设定:属主 rw,属组和其他人 r(= 644)

三个部件:u 属主、g 属组、o 其他人、a 所有人)、操作符+ 加、- 去、= 精确设为)、权限rwx)。有个细节:省略「谁」、也就是光写 chmod +x 时,它瞄准全部三类,却会被你的 umask 过滤,所以未必每个执行位都会打开。要确定就把类别写明——u+xa+x。想从头写定一个文件的整套模式,用八进制;想只翻动某一位而不惊动其余,用符号写法。计算器 两个方向都能走——输入一串符号,读出八进制;或者拼出八进制,读出符号。它换算的是权限位,读不到你本机的 umask,所以光写 +x 时给它写明「谁」——u+xa+x——工具的结果才会和你真正要跑的命令一致。

跨系统读权限

设权限这件事,在 Linux、macOS 和各种 BSD 上做法一样。只是别把上面那两条命令当成一回事:chmod 755 一次设定完整的基本模式,chmod u+x 只改属主那一个执行位,其余保持原样。读回当前模式,才是各系统分道扬镳的地方:

  • ls -l 到处都打印 -rwxr-xr-x 这种形式——再提醒一次,第一个字符是文件类型,不是权限。
  • 想直接拿到八进制:GNU/Linuxstat -c '%a' filemacOS/BSDstat -f '%Lp' file。(Linux 上 stat -c '%A' 打印符号形式。)
  • Windows 完全是另一套模型:NTFS 靠 ACL,不是 Unix 的权限位,所以原生 Windows 工具不认 755。在 WSL 里,Linux 文件系统上的文件表现正常,但挂载的 Windows 盘(/mnt/c)上,结果取决于 DrvFS 的 metadata 选项和底层的 Windows ACL——那里的 chmod 未必等同于原生 Linux 文件系统上的 chmod,而且哪怕显示成 777,也照样越不过 ACL。

755 没告诉你的事

有三样东西就在这三位数字之外,每一样都是常见的困惑来源:

  1. 第四位,最前面那一位。 755 其实是 0755。开头那个 0 是留给特殊位的槽,它们的解码方式和其余的一样:

    数字例子
    4setuid——以文件属主的身份运行程序可执行文件上的 4755
    2setgid——以文件属组身份运行;在目录上新条目继承该组共享目录上的 2775
    1sticky——共享目录里,条目只能由它的属主、目录属主或 root 来删除或重命名/tmp 上的 1777

    解码就这么简单。它们运行时具体做什么、又会怎样把你绊倒,是另一篇要展开的内容。

  2. 属主归属。 权限决定属主、属组、其他人能做什么,但 chmod 从不改变属主和属组是谁。那是 chown 的活儿,把两者搞混,正是许多「我都设成 777 了怎么还不行」的根源。

  3. 另有一整套把关的东西。 模式只是第一道检查。一条 ACL、一份 SELinux 或 AppArmor 策略、一个只读或 noexec 的挂载点、或是父目录缺了 x,都能把一个自身模式看着大开的文件挡在门外。这就是 chmod 777 有时毫无改变的原因——也是为什么这里说的「任意权限」指的是读懂模式,而不是守着文件的每一层。把这些层一一理清,是另一轮排查的事。

一张阅读清单

一个模式摆到你面前时:

  1. 拆成三位数字——属主、属组、其他人,就这个顺序。
  2. 用 4(r)+ 2(w)+ 1(x)拆开每一位。 7rwx6rw-5r-x4r--
  3. 记住执行位对目标的含义。 在文件上是「运行我」;在目录上是「进来并访问里面的东西」。
  4. 看有没有第四位。 开头的 124 是特殊位——sticky、setgid、setuid,用同样的方法解码,但它们运行时的行为是另一个故事。
  5. 把权限和归属分开。 模式定义属主、属组、其他人各自能做什么;chown 改的是文件的属主和属组,而访问时实际适用哪一类,取决于访问者的身份和组成员关系。

做到这些,644755700 就能一眼读懂。而当你宁愿核对而不想心算——或者想把一个模式和它的 rwxr-xr-x 字符串并排看——把它丢进 Chmod 权限计算器:八进制进、符号出,两个方向都行,还把文件与目录的区别一并讲明。