piapia123
zh

Linux 文件权限换算

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

改权限是部署日常,而三种写法各有用处又互相看不懂:`755` 是配置文件与 Dockerfile 里写的那个,`u+x,g-w,o=r` 是 `chmod` 命令行的写法,`drwxr-xr-x` 是 `ls -l` 打印出来、别人截图发给你的那一串。这里把三种互相翻译,并逐位说清每一位是什么意思。 三个特殊位(八进制里的第一位)单独解释,而且只在开着的时候才出现:`4` setuid、`2` setgid、`1` sticky。它们在 `ls -l` 里借 execute 那一格显示,所以有 `s` 与 `S` 两种写法 —— `S` 是「特殊位开着但文件不可执行」,在真实系统上几乎总是配错了,本工具会单独指出来。

功能

  • 三种写法互转:八进制(755 / 0755 / 0o755)、符号式(u+x,g-w,o=r)、ls -l 那一串(-rwxr-xr-x / drwxr-xr-x)
  • 逐位解释:属主 / 属组 / 其他各自能读、能写、还是能执行
  • 三个特殊位单独说明:setuid、setgid(对目录是继承属组)、sticky(对目录是只有属主能删)
  • ⚠️ 「大写 S / T」会单独提示 —— 那意味着特殊位开着但不可执行,几乎总是配错了
  • 按 umask 推算新建文件(666 & ~umask)与目录(777 & ~umask)的默认权限
  • 顺带给出可直接粘贴的 chmod 命令;输入本身就是一整条命令时,路径与 -R 这类选项原样带回去
  • 符号式的 `+x` 省略「给谁」时,以选项里给的起始权限为准 —— 而不是猜 umask
  • 支持 `g=u` 这种「以另一类为源」的赋值:`=` 先清空再设置,且同一条命令里从左到右依次生效(`u=x,g=u` 与 `g=u,u=x` 结果不同)
  • ⚠️ 认不出时把错误指到具体那个字符(第几个、是什么、附近的片段),不是一句笼统的「格式不对」

使用方法

  1. 把要换算的权限粘进去:八进制、符号式、ls -l 那一串,或者从文档里整条复制的 chmod 命令都行
  2. 需要的话改「起始权限」(符号式省略 who 时用)与 umask
  3. 结果里给出另外两种写法、逐位解释与 chmod 命令

常见问题

755 和 0755 有区别吗?
没有。前导的 `0` 只是表明这是八进制字面量(在 C 与 Shell 里防止被当成十进制或十六进制)。本工具统一按四位输出,就是为了避免两种写法混着用让人以为有区别。但两位的 `77` 会被拒绝:它可能是漏写一位的 `077`,也可能是 `0077`,两者差出属主与属组两整类权限,猜错的口子开在哪儿都看不出来。
rwxr-xr-x 和 -rwxr-xr-x 有什么区别?
第一个是权限位本身(9 个字符),第二个多了最前面的类型字符:`-` 是普通文件、`d` 是目录、`l` 是符号链接。类型不参与权限计算,但它会影响 sticky 位怎么读 —— 所以本工具两种都收,并在输出里保留 `d`。
setgid 不是给可执行文件用的吗?
对文件是以所属组的身份运行,但对目录是另一回事:在开了 setgid 的目录里新建的文件会继承该目录的属组,而不是创建者的主组。共享目录靠的就是后一个行为,很多人只记得前者。
为什么我算出来的新建文件权限不是 644?
新建文件的默认权限是 `666 & ~umask`,目录是 `777 & ~umask`。文件从 666 起是因为新建的普通文件不该默认带执行位;目录从 777 起是因为目录没有执行位就进不去。所以 umask 是 022 时文件得 644、目录得 755;umask 改成 077 就分别变成 600 与 700。
`u+x` 里的 u 是什么?省略了会怎样?
`u` 是文件属主(user)、`g` 是属组、`o` 是其他、`a` 是三者。省略 who(写成 `+x`)时,真实 `chmod` 的语义是「按 umask 决定给谁」—— 而 umask 是进程状态不是固定值。所以本工具不猜它,而是用上面那个「起始权限」选项一起算,并把这条约定写出来。
大写 X 和小写 x 差在哪?
`x` 无条件加执行位;`X` 只在「已经是目录」或「已经有人有执行位」时才加。`chmod -R a+X` 是最常见的用法 —— 让目录能进去、又不把里面所有数据文件都变成可执行。本工具拿不到「是不是目录」,所以按后一个条件判断。
`g=u` 是什么意思?
运算符右边可以是一个「类」(`u`/`g`/`o`),表示拷另一类的权限:`g=u` 把属主的 rwx 三位拷给属组,`u=g,o=g` 之类的组合也成立。⚠️ 两件事容易记错:① `=` 的语义是先清空再设置,所以属组原有的、而属主没有的位会被去掉,不是「或」上去;② 同一条命令里从左到右依次生效,源那一类取的是算到此刻的值 —— 所以 `u=x,g=u`(g 拿到新的 u=1)与 `g=u,u=x`(g 拿到旧的 u)结果不同。特殊位不参与拷贝。

相关工具