使用方法
- 页面打开时勾选状态就是 644:所有者 r、w 两格,属组和其他人各只有 r 格。上方的八进制、符号串与命令三张卡片给出的都是这个默认示例的结果,先看一眼就知道输出长什么样。
- 改权限最直接的方式是点复选框:比如给所有者补上「执行 x (1)」,八进制立刻从 644 变 744,符号串从 rw-r--r-- 变 rwxr--r--。这张 chmod权限计算器的矩阵是双向的,勾选与数字永远同步。
- 手头只有一个数字时,把它填进「八进制输入」框(示例 644)后按回车;只有一个符号串时填「符号模式输入」框(示例 u=rw,g=r,o=r),支持 u+x、go-w、a=rwx 这类写法,多段用逗号隔开。
- 需要第四位时勾「特殊位」那一行的 setuid / setgid / sticky,八进制会自动变成 4 位(示例 4755);命令卡片始终给出可直接粘贴的 chmod 命令,点「复制命令」拿走。
- 底部的对照表列出 14 个常用权限值。填完不确定合不合理时,对照表里找相近的行,再看「边界、特殊位与常见误读」一节核对特殊位的含义。
这个chmod权限计算器能解决什么问题
一是看懂 ls -l 输出。终端里看到 drwxr-xr-x 时,新手很难瞬间把它和 755 对上号:本页的矩阵把 9 个字符拆成 3 行 3 列,哪一位对应哪个数字一目了然,反向输入 755 也立刻还原成符号串。
二是拼出最小权限而不是抄 777。论坛老答案爱给一句 chmod -R 777,出了问题再后悔。在矩阵里逐格勾选,你会亲眼看到「其他人可写」那格亮起来时警告区的提示——按需求只勾真正需要的位,比如 Web 目录 755 加文件 644,就够绝大多数部署用。
三是核对特殊位。setuid、setgid、sticky 在 ls -l 里藏在 x 的位置上,显示成 s、S、t、T,多数人一年也遇不到几次。本页把三个特殊位单独列一行,勾上就进第四位八进制,符号串里大写 S 和小写 s 的区别也会如实反映(组无执行位时是 S)。
四是生成能直接粘贴的命令。算出 640 之后还要回忆 chmod 语法?本页命令卡片直接给出 chmod 640 file.txt,符号模式的等价写法也一并列出,两种习惯都能照抄。
本页不做这些事:不改真实文件的权限(终端里的 chmod 才是执行者,本页只负责算);不做 chown 属主属组的计算;不涉及 umask 的默认权限扣除(那是新建文件时的另一套规则,可参考页面底部的 Git 速查表等开发者工具排查仓库内文件权限问题)。
原理:rwx=421 与三位八进制
整个换算只依赖一个权重表:r=4、w=2、x=1,每类用户三位相加得到一个 0~7 的八进制数字。6 = 4+2 = rw,5 = 4+1 = rx,4 = r,7 = 4+2+1 = rwx。三位数字依次拼给所有者、属组、其他人,这就是 644 的全部含义:所有者 6(rw),属组 4(r),其他人 4(r)。四位写法时第四位是特殊位 4/2/1 的同样加法:setuid=4、setgid=2、sticky=1。
组合总数是个确定的数:每位 8 种取值,三位八进制一共 8³ = 512 种权限,加第四位就是 8⁴ = 4096 种。777 是其中最大的一种,十进制值 511,恰好等于 2⁹−1——9 个权限位全 1。644 的十进制是 420,755 是 493,脚本里偶尔用数字形式(如 PHP 的 fileperms())时会遇到。
符号模式 ugoa+-=rwxst 的语义来自 POSIX:who 部分省略时等价于 a(全部),但有一个例外——只写 +x 时,部分实现会受 umask 影响,明确写 a+x 更稳。op 三种动作里 = 是「精确赋值」:未列出的位一律清零,所以 u=rw 会顺手抹掉所有者的 x 位,这点和 + 只叠加不同。s 和 t 写在权限字母里:s 出现在 u 段设 setuid、出现在 g 段设 setgid,t 出现在 o 段设 sticky。
为什么用八进制而不是十进制?因为 8 = 2³,一个八进制位恰好装下一个 3-bit 组,不存在跨位借位。写成十进制 420 就完全看不出各位是什么——这正是这份 chmod权限计算器坚持展示双向结果的原因:八进制给人抄命令,符号串给人读含义。
完整示例(数值仅作演示)
示例条件与页面打开时的默认状态完全一致:所有者勾 r+w(4+2=6),属组勾 r(4),其他人勾 r(4),特殊位全空。这套勾选的实测输出是:
- 八进制 644(四位写法 0644),符号串 rw-r--r--;
- 符号模式等价写法 u=rw,g=r,o=r,十进制值 420;
- 生成的命令 chmod 644 file.txt;
- 警告区为空:其他人不可写,没有特殊位,不需要提示。
换两组数字看联动过程。输入 755 反推:所有者 7 → r+w+x 全勾,属组与其他人 5 → 各勾 r 和 x,符号串 rwxr-xr-x,十进制 493。再试 4755:勾上 setuid 后八进制从 755 变 4755,符号串第一段从 rwx 变 rws——s 占用的正是执行位的位置,含义是「运行时以属主身份执行」。这两组数字与对照表里的行逐位一致。
输入范围与常用权限对照表
八进制输入框接受 3~4 位 0-7 数字(最长 4 字符),644、755、4755、1777 都合法;出现 8、9 或位数不对会按具体原因报错,不会静默归零。符号输入接受逗号分隔的多段 [ugoa][+-=][rwxst]。高频值直接查表:
- 网站部署最常用的三件套:目录 755、文件 644、私钥 600;
- 团队共享目录用 2775 或 2770(setgid 保证新文件继承属组);
- /tmp 的 1777 是 sticky 的教科书场景;
- 444、0000 这类「自锁」值记得留退路:0000 之后连属主都要先改权限。
表里的每一行都可以在本页矩阵里复现:把 2755 填进八进制输入框,矩阵会勾出 setgid 加 755 的九格,与表内符号串 rwxr-sr-x 一致。
边界、特殊位与常见误读
- s 与 S 的区别是执行位。setuid 置位且所有者有 x 显示小写 s(rws);所有者没有 x 时显示大写 S(rwS)——此时 setuid 「空挂」,不会生效。setgid 与组的 s/S、sticky 与其他人的 t/T 同理。本页符号串按这个规则输出,勾选即可看到。
- 目录的 x 是「进入」。对文件,x 是可执行;对目录,x 是可以 cd 进去、可以访问内部文件。给目录 644 是常见事故:能列目录名却打不开里面的文件。目录基准是 755(或更严的 750)。
- 八进制没有 8 和 9。输入 779 会报错而不是四舍五入成 780——权限每一位都是独立的 3-bit 组,8 已经溢出。同样不支持负数与小数。
- 脚本上的 setuid 多数系统直接忽略。内核对解释器脚本(#! 开头)不赋予 setuid 语义,这是安全设计。需要「以某身份运行」请用 sudo 等机制。
- 本页只算 9+3 位,不含 ACL。setfacl 的扩展 ACL、chattr 的不可变位都不在 chmod 体系内,
ls -l末尾的 + 号即 ACL 标记。 - 组合总数里「其他人可写」占一半。512 种三位组合中,o 位含 w=2 的取值是 4 个(2、3、6、7),占 8 个取值的一半——o 位只要随手填,就有一半概率带上写权限,这正是警告区盯着 o 位的原因。
- umask 是另一条规则。它决定新建文件的默认权限(常见 022,把 666/777 扣成 644/755),本页算的是显式 chmod 的目标值,两者不要混谈。
常见问题
777 到底有什么风险?
777 意味着任何能登录这台机器的账号都可以改这个文件、改完还能执行它。配合可写目录,攻击者可以替换脚本、植入后门。Web 场景下很多人用 777 「解决」上传问题,正确做法是把目录属主改成运行 PHP 的用户,再给 755。这个 chmod权限计算器在矩阵里把「其他人可写」一格做成显式警告,就是为了让你看见自己在开什么。
为什么输入 779 或 648 会报错?
八进制每一位只有 0~7 八种取值,8 和 9 根本不存在——779 不是「比 777 大一点的权限」,而是非法输入。648 同理,第三位的 8 无法映射回 rwx 三位。工具按具体数字报错并提示改写,而不是猜一个最近邻值,因为权限差一位就是安全事故。
目录和文件该用什么权限?
目录的 x 位是「进入权」,所以目录基准是 755(自己全权、他人可进可读);文件不需要进入,644 即可。常见误区是给目录 644:能 ls 出文件名,却读不了内容。反过来给文件 755 则会让它「可执行」,若目录允许被人写入,等于开放了任意代码执行的入口。
s 和 S、t 和 T 的区别是什么?
小写表示特殊位「连同执行位」一起生效:rws、rwt 都含 x。大写表示特殊位置位但执行位是空的:rwS、rwT 属于「空挂」状态,不产生效果。查 ls -l 看到大写时,先补 x 再谈特殊位。本页符号串严格按此规则渲染,对照表 2644 那行就是大写 S 的实例。
符号模式里不写 who(如 +x)和写 a+x 一样吗?
不完全一样。POSIX 规定 who 省略时等价于 a,但「仅 +x 且 umask 有限制」的场合,多数实现会让省略 who 的 +x 只作用于 umask 允许的部分;显式写 a+x 则无视 umask 全部加上。写脚本时建议永远把 who 写全,语义只依赖命令本身。
600 和 644 该给私钥还是网页文件?
私钥 600:只有属主能读,SSH 对权限过宽的私钥会直接拒绝使用。网页文件 644:Web 服务进程需要读,属主需要写,其他人只读没有风险。判断口径就一条——「谁必须读、谁必须写」,其余一律收掉。拿不准时把两种身份填进本页矩阵,看哪几格是真正需要的。
第四位 4、2、1 分别是什么?
4 是 setuid(运行时以文件属主身份生效)、2 是 setgid(运行时以属组身份;用在目录上则新文件继承目录属组)、1 是 sticky(用在目录上,只有属主能删自己的文件)。它们合进八进制第四位:4755 = setuid+755。对照表里 4755、2755、1777 三行是各自的代表场景。
算出来的结果怎么用在 git 仓库里?
git 只记录文件的「可执行位」这一个权限信息(100644 与 100755 两种模式),其余位由本地系统决定。所以仓库里对不对得上,先看文件是否该有 x 位;权限改动可以用 git update-index --chmod=+x 登记。整套分支与命令速查,见本页底部的 Git 速查表。