Chmod 权限计算器

勾选属主、属组和其他用户的读、写、执行权限,即可得到八进制 chmod 数字、rwx 符号字符串以及可直接粘贴到终端的命令。

勾选复选框得到数字,或输入数字查看它实际允许什么。 权限面向三类对象——文件属主、属组和其他所有人——每类各自独立拥有读、写、执行三种权限。你可以切换表格,也可以直接输入八进制值,两者会保持同步。

对象 读 (4) 写 (2) 执行 (1)
属主 (u)
属组 (g)
其他人 (o)

读写 Unix 权限位

三组三元位

每个 Unix 文件都带有九个权限位,按三位一组分成三组。第一组属于文件属主,第二组属于文件所属的组,第三组属于系统上的其他所有人。每组中的三位分别表示读、写、执行,权值依次为 4、2、1。把需要的位相加即可得到 0 到 7 之间的一个数字,这就是权限历来用三位八进制数书写的原因。

755 这样的数字正是由此而来。属主位是 7,即 4 + 2 + 1,因此属主可读、可写、可执行;属组位和其他人位都是 5,即 4 + 1,可读可执行但不能修改。同一个值用符号写法表示就是 rwxr-xr-x,也正是 ls -l 在文件类型字符之后打印的内容。

这三个动词在目录上的含义略有不同:读允许列出目录内的名称,写允许创建和删除条目,执行允许进入目录并访问一个已知路径。只有读而没有执行权限的目录几乎没有用——你能看到名字,却打不开背后的任何东西。

你真正会用到的数值

少数几种组合就能覆盖大部分实际工作。644(rw-r--r--)是文档或源文件的常规模式:属主编辑,其他人只读。755(rwxr-xr-x)是目录和可执行脚本的常规模式,因为二者都必须有执行位才能使用。600(rw-------)让文件仅对属主可见,这正是 OpenSSH 对私钥的强制要求;目录对应的是 700。

赋予他人写权限的模式值得再三斟酌。777 意味着机器上任何账号都能覆盖或删除该文件,它几乎从来不是正确答案——它只是在不理解问题的前提下让权限报错最快消失的办法。当 Web 服务器无法写入上传目录时,真正的修复方式通常是用 chown 更改属主或属组,而不是把文件对全世界开放。

权限还与 umask 相互作用。新文件按默认模式减去 umask 值创建,常见的 umask 是 022,这就是新建文件通常是 644 而不是 666 的原因。

setuid、setgid 与粘滞位

在这三位之前还可以有第四位,它携带三个特殊位:setuid(4)、setgid(2)和粘滞位(1)。它们改变程序以谁的身份运行,以及目录如何对待其中新建的文件。

可执行文件上的 setuid 会让它以文件属主而非启动者的权限运行。passwd 正是靠它在普通用户执行时更新系统文件,这也是 setuid 程序需要被严格审计的原因——其中一个缺陷就是通往属主权限的直通车。setgid 对属组起同样作用。在目录上,setgid 的含义更为友好:目录内新建的文件会继承该目录的属组,从而让共享项目目录始终保持一致。

粘滞位最常见于 /tmp,通常写作 1777。它允许任何人在目录中创建文件,同时把删除权限限制为文件自身的属主,使用户无法删除彼此的临时文件。在长格式列表中这些位会替换执行位字符:s 取代 x 表示设置了 setuid 或 setgid,大写 S 表示设置了该位但没有执行权限,t 则标记粘滞位。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

755 到底是什么意思?
属主可读、可写、可执行;属组和其他人可读、可执行但不能修改。这是目录以及需要被他人运行的脚本的常规模式。
脚本可读却提示 permission denied,为什么?
读取文件和运行文件是两个独立的权限位。脚本需要对应用户拥有执行位,644 是不够的——请改为 755,或者显式通过解释器运行它。
777 有合适的使用场景吗?
在共享或对外网开放的机器上几乎没有,因为它让任何本地账号都能修改或删除该文件。若某个服务无法写入,应改变属主或属组,而不是放宽模式。
644 和 0644 有什么区别?
对九个标准位而言没有区别。开头的 0 是特殊位那一位,设为 0 会清除 setuid、setgid 和粘滞位。很多人写四位纯粹是出于习惯。
SSH 为什么拒绝使用我的私钥?
OpenSSH 会拒绝其他用户可读的私钥。把密钥设为 600、把所在的 .ssh 目录设为 700,警告就会消失。
chmod 在 macOS 和 Linux 上表现一致吗?
数字模式完全相同。差异出现在扩展属性和 ACL 上,macOS 会在权限字符串后用 `+` 标示,而这部分并不由 chmod 单独管理。