Unix 权限参考 · 免费

Chmod 计算器

把读取、写入和执行复选框转换成八进制模式、符号字符串和 chmod 命令;也可以粘贴已有的模式,用通俗的语言看清它到底允许谁访问。

纯算术运算,全在此浏览器中完成 · 不上传任何内容
报告问题

模式 755,符号 rwxr-xr-x,对象为文件。chmod 755 script.sh。没有警告。

权限矩阵

九个复选框,三位数字

每个类别对应一个八进制数字,每个数字就是勾选项相加的结果。

所有者、所属组和所有其他用户的读取、写入和执行权限
类别读取r · 4写入w · 2执行x · 1数字
所有者u · 用户7
所属组g · 组5
其他用户o · 其他5
文件上的读取

打开文件并读取其字节,或将其复制到别处。

文件上的写入

修改或截断内容。删除文件则由其所在目录决定。

文件上的执行

将其作为程序运行。脚本还需要读取权限,因为解释器必须打开它。

数字对照表0 = ---1 = --x2 = -w-3 = -wx4 = r--5 = r-x6 = rw-7 = rwx
第四位数字

setuid、setgid 与粘滞位

这三个位位于模式前面,处在大多数人从不书写的那一位数字中。每一个都会改变进程以谁的身份运行,或改变目录允许的操作;设置之前请先阅读说明。

通俗解释

755 在此文件上允许什么

  • 所有者
    u · 7

    所有者可以读取文件、修改文件和将其作为程序运行。

    单个账户:inode 上记录的用户 ID,也就是 ls -l 行中两个名称里的第一个。root 几乎完全绕过这些检查,所以模式只能约束普通用户。

  • 所属组
    g · 5

    组成员可以读取文件和将其作为程序运行。

    文件所属组中的每个账户,即 ls -l 行中的第二个名称。正是组成员身份让团队可以共享写入权限,而不必向整台机器开放。

  • 其他用户
    o · 5

    其他所有人可以读取文件和将其作为程序运行。

    前两个类别没有覆盖到的所有人:其他登录用户,以及 www-data、nobody 等所有守护进程账户。攻击者落脚的正是这个类别。

安全检查

关于此模式值得了解的事项

这里没有自相矛盾的设置

没有所有人可写的位,也没有无法生效的特殊权限位。但这并不等于正确:模式仍需符合这个文件的用途。

可靠的常用模式

从这类任务通常需要的模式开始

整个目录树

一次修正所有层级

一条递归 chmod 会给目录和文档设置相同的模式:要么文件变成可执行,要么目录变得无法进入。把它拆成两条,每种类型都能得到所需的模式。

目录 → 755
find script.sh -type d -exec chmod 755 {} +
文件 → 644
find script.sh -type f -exec chmod 644 {} +
umask

新文件的初始模式

umask 做的是减法。内核为新文件提供 666,为新目录提供 777,然后清除掩码指定的每一位。

新文件
644
新目录
755

在常见的 022 下,这就是你刚创建的文件为什么是 644 而不是 666:在你看到它之前,掩码已经去掉了所属组和其他用户的写入位。这里不会改变你的 shell,只是对你输入的值做算术。

工作原理

三个类别,三个位,一个数字。

Unix 用九个位记录权限:读取、写入和执行,分别为所有者、所属组和其他所有人各重复一次。每三个位分为一组,每组正好对应一个 0 到 7 的八进制数字,这也是 chmod 接受 755 这样的数字而不是一句话的唯一原因。内核按顺序检查这些类别(先所有者,再所属组,最后其他用户),并在第一个与你匹配的类别处停下,因此即使模式对其他用户很宽松,也救不了被拒绝访问的所有者。

  1. 01

    先说明是文件还是目录

    同样的三个位在两者上含义不同。先切换这个开关,页面上的所有解释都会随之改变:执行不再表示运行,而是表示进入。

  2. 02

    勾选复选框,或粘贴已有的模式

    为所有者、所属组和其他用户切换读取、写入和执行。手头已经有一个模式?把 0644 或 ls -l 列表中的十个字符粘贴到反向输入框,网格会自动填好。

  3. 03

    输入路径,拿走命令

    填写真实目标,然后复制八进制命令、适合脚本使用的赋值形式,或者一次性为目录和文档设置不同模式的那对 find 命令。

为修复真实服务器而打造

模式的每种形式,始终保持同步。

一个网格,四种表示法

复选框矩阵、三位八进制、四位八进制、符号字符串和 ls -l 行都是同样九个位的不同视图,每次按键都会同步重绘。

既能写出模式,也能读懂模式

粘贴 700、0755、rwxrwxr-x 或 drwxr-xr-x 都可以。十个字符的列表形式甚至会根据首字母自动设置文件或目录开关;无法解析的输入会明确提示,而不是悄悄忽略你。

目录语义,逐条写明

读取列出名称,写入添加和删除条目,执行让路径查找得以穿过。这些句子根据你当前的模式生成,而不是从固定表格里照搬。

第四位数字,不靠道听途说

setuid、setgid 和粘滞位各有独立的开关和说明,包括内核完全忽略的情况:shell 脚本上的 setuid,普通文件上的粘滞位。

在真正容易出错的地方给出警告

所有人可写、无人能执行的文件却带着 setuid 位、脚本有执行权限却没有读取权限:每种情况都用各自的颜色标出,并说明原因,而不是一味说教。

无需修改即可粘贴的命令

八进制形式、u=rwx,g=rx,o=rx 赋值形式,以及用于混合目录树的两条 find 命令,你输入的目标路径已经填好。全部在你的浏览器中生成。

权限常见问题

八进制数字、特殊权限位、目录与 umask。

chmod 755 到底是什么意思?+

每一位数字对应一个类别:依次是所有者、所属组和其他用户。在一位数字中,读取为 4,写入为 2,执行为 1,所以 7 是 4+2+1(读取、写入、执行),5 是 4+1(读取和执行),0 表示没有任何权限。因此 755 允许所有者执行所有操作,而所属组和其他所有人可以读取和执行,但不能修改。这是程序以及系统中几乎所有目录的常用模式。

644 和 755 有什么区别?+

只差执行位。644 给所有者读取和写入权限,给其他所有人读取权限;755 为三个类别都加上执行权限。数据文件应使用 644;PDF 或照片上的执行位除了制造混乱毫无用处。程序、shell 脚本和所有目录应使用 755,因为没有执行权限的目录,即使能列出内容的人也无法进入。

为什么 chmod 777 是安全隐患而不是解决办法?+

它把写入权限授予机器上的每个账户,包括攻击者最先拿到的服务账户。以 www-data 身份运行、又能改写自己所提供应用的 Web 服务器,会把一个小小的文件上传漏洞变成任意代码执行。动用 777 还意味着真正的原因(通常是所有者或所属组不对)永远不会被找到,因此原始错误早已被遗忘,暴露却一直存在。请用 chown 修正所有权,并授予能正常工作的最小权限模式。

什么时候需要第四位数字?+

只有在设置 setuid(4000)、setgid(2000)或粘滞位(1000)时才需要。写 755 和 0755 效果相同,因为缺少的前导数字按零处理。意外出现在再次清除这些位的时候:GNU chmod 会刻意保留目录的 setuid 和 setgid,除非你明确指定,所以在 Linux 上,chmod 755 和 chmod 0755 都不会去掉目录的 setgid;这需要 chmod g-s、chmod =755 或五位数的 chmod 00755。BSD chmod(包括 macOS)则相反,普通的三位模式就会清除它们。对于普通文件,所有版本都会清除。

ls -l 行中的大写 S 或 T 是什么意思?+

表示特殊权限位已设置,但对应的执行位没有设置,因此特殊权限位无法生效。rwSr--r-- 是所有者无法执行的 setuid 文件;drwxrwxrwT 是其他用户没有执行权限的粘滞目录。小写的 s 或 t 表示两个位都已设置,行为真正生效。大写字母通常意味着设置特殊权限位之后执行位又被清除了,或者输入四位模式时漏了对应的 x;无论哪种情况,这个模式都不像看上去那样起作用。

别人对我的文件没有写入权限,为什么还能删除它?+

因为删除不是对文件本身的操作,而是对保存该名称的目录的操作。只要对目录有写入加执行权限,就足以解除其中任何条目的链接,不管文件本身的权限如何。这正是粘滞位要堵上的漏洞:在 /tmp 这样的 1777 目录中,只有条目的所有者、目录的所有者或 root 才能删除它。

执行位对目录有什么作用?+

它授予遍历权:解析目录内的名称并访问更深层内容的权利。读取和执行相互独立:有读取而无执行时,你能列出名称却无法使用它们,所以 ls 可以运行,但打开任何结果都会失败。有执行而无读取则正好相反,而且是一种实用技巧:给主目录设置 711 模式,Web 服务器就能访问 public_html,而任何人都无法列出里面还有什么。路径上的每个目录都需要执行权限,否则查找会在那一层失败。

umask 和 chmod 有什么关系?+

chmod 直接设定模式;umask 只会去掉权限位,而且只在创建对象的那一刻起作用。内核为新文件提供 666,为新目录提供 777,然后清除掩码指定的每一位,所以常见的 umask 022 会生成 644 的文件和 755 的目录,这也是新文件永远不可执行的原因。它是按进程生效的设置,在某个 shell 中修改只影响该 shell 及其子进程,对已经存在的任何东西都没有影响。

更多专注好用的工具,随时待命。

探索不断扩充的工具合集,涵盖计算、文档、写作和日常工作。

浏览全部工具