chmod 755 到底是什么意思?(顺便学会读懂任意权限)
755 那三个数字不是魔法,而是一套「谁能读、能写、能执行」的编码。这篇带你一眼读懂 755、644、700,并讲清执行位在目录上为什么是另一个意思。
从 Stack Overflow 抄来那行 chmod 755 deploy.sh,跑通了。可 755 就是三个没头没脑的数字,等下次脚本跑不起来、或者网页服务器回你一个 403,你又只能对着数字碰运气。好消息是:这三个数字不是什么咒语,而是一套一眼就能读的编码。读懂之后,755、644、700 就不再是照抄的数字,而是你自己做的决定。
三类用户,三种权限
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 这三位,按顺序对应三类用户——属主、属组、其他人。每一位把该类的三种权限,用固定的数值相加编码出来:
| 权限 | 数值 |
|---|---|
读(r) | 4 |
写(w) | 2 |
执行(x) | 1 |
把你想开的权限对应的数值加起来,就得到一位 0 到 7 之间的数字:
| 数字 | 相加 | 权限 |
|---|---|---|
| 7 | 4 + 2 + 1 | rwx |
| 6 | 4 + 2 | rw- |
| 5 | 4 + 1 | r-x |
| 4 | 4 | r-- |
| 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 怎么选专门拆解了这个决定:
| 八进制 | 符号 | 典型用途 |
|---|---|---|
644 | rw-r--r-- | 普通文件——文档、配置、源码 |
755 | rwxr-xr-x | 目录,以及任何人都可运行的脚本或程序 |
700 | rwx------ | 私有目录或脚本——只有属主 |
600 | rw------- | 私有文件——SSH 私钥就该是这个 |
750 | rwxr-x--- | 属主全开,属组可用,其他人挡在外面 |
775 | rwxrwxr-x | 属组也能写——共享的项目目录 |
两条规律就能解释这张表的大半。数据文件用 644(私有时 600):属主读写,其他人只读或什么都没有,没有执行位。要遍历或要运行的东西——目录和程序——用 755(想收窄就 750/700):跟 644 一个思路,再加上执行位,因为少了执行位,它们存在的意义就没了。这就引出了大多数教程会跳过的那个问题。
执行位在目录上是另一回事
对文件,x 很直白:允许把它当程序跑。对目录,x 跟「运行」毫无关系——想通这一点,755 落在文件夹上才说得通。
在目录上:
r让你列出里面的名字(ls)x让你进入这个目录——cd进去、穿过它,并按一个你已经知道的名字去访问文件w——但必须和x一起——才让你创建、重命名、删除条目
意外之处在于 r 和 x 有多么互不相干。一个只有 r 没有 x 的目录,你能看到文件名,却读不了文件本身,连 stat 都不行。一个只有 x 没有 r 的目录,你能打开里面的文件——前提是你已经知道确切的名字——但 ls 会失败。而改动目录里的东西,也就是新建或删除一个文件,需要在这个目录上同时有 w 和 x,跟文件本身的权限无关。实际用起来,你总是希望 r 和 x 一起有——这就是别人需要穿过的目录通常是 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 所有人)、操作符(+ 加、- 去、= 精确设为)、权限(r、w、x)。有个细节:省略「谁」、也就是光写 chmod +x 时,它瞄准全部三类,却会被你的 umask 过滤,所以未必每个执行位都会打开。要确定就把类别写明——u+x、a+x。想从头写定一个文件的整套模式,用八进制;想只翻动某一位而不惊动其余,用符号写法。计算器 两个方向都能走——输入一串符号,读出八进制;或者拼出八进制,读出符号。它换算的是权限位,读不到你本机的 umask,所以光写 +x 时给它写明「谁」——u+x、a+x——工具的结果才会和你真正要跑的命令一致。
跨系统读权限
设权限这件事,在 Linux、macOS 和各种 BSD 上做法一样。只是别把上面那两条命令当成一回事:chmod 755 一次设定完整的基本模式,chmod u+x 只改属主那一个执行位,其余保持原样。读回当前模式,才是各系统分道扬镳的地方:
ls -l到处都打印-rwxr-xr-x这种形式——再提醒一次,第一个字符是文件类型,不是权限。- 想直接拿到八进制:GNU/Linux 用
stat -c '%a' file;macOS/BSD 用stat -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 没告诉你的事
有三样东西就在这三位数字之外,每一样都是常见的困惑来源:
-
第四位,最前面那一位。
755其实是0755。开头那个0是留给特殊位的槽,它们的解码方式和其余的一样:数字 位 例子 4setuid——以文件属主的身份运行程序 可执行文件上的 47552setgid——以文件属组身份运行;在目录上新条目继承该组 共享目录上的 27751sticky——共享目录里,条目只能由它的属主、目录属主或 root 来删除或重命名 /tmp上的1777解码就这么简单。它们运行时具体做什么、又会怎样把你绊倒,是另一篇要展开的内容。
-
属主归属。 权限决定属主、属组、其他人能做什么,但
chmod从不改变属主和属组是谁。那是chown的活儿,把两者搞混,正是许多「我都设成777了怎么还不行」的根源。 -
另有一整套把关的东西。 模式只是第一道检查。一条 ACL、一份 SELinux 或 AppArmor 策略、一个只读或
noexec的挂载点、或是父目录缺了x,都能把一个自身模式看着大开的文件挡在门外。这就是chmod 777有时毫无改变的原因——也是为什么这里说的「任意权限」指的是读懂模式,而不是守着文件的每一层。把这些层一一理清,是另一轮排查的事。
一张阅读清单
一个模式摆到你面前时:
- 拆成三位数字——属主、属组、其他人,就这个顺序。
- 用 4(
r)+ 2(w)+ 1(x)拆开每一位。7是rwx,6是rw-,5是r-x,4是r--。 - 记住执行位对目标的含义。 在文件上是「运行我」;在目录上是「进来并访问里面的东西」。
- 看有没有第四位。 开头的
1、2、4是特殊位——sticky、setgid、setuid,用同样的方法解码,但它们运行时的行为是另一个故事。 - 把权限和归属分开。 模式定义属主、属组、其他人各自能做什么;
chown改的是文件的属主和属组,而访问时实际适用哪一类,取决于访问者的身份和组成员关系。
做到这些,644、755、700 就能一眼读懂。而当你宁愿核对而不想心算——或者想把一个模式和它的 rwxr-xr-x 字符串并排看——把它丢进 Chmod 权限计算器:八进制进、符号出,两个方向都行,还把文件与目录的区别一并讲明。