DevKitLab Logo DevKitLab
chmod / Unix / 文件权限 / Linux

chmod 644 和 755:文件与目录该怎么选?

644 适合普通文件,755 常用于目录和可执行程序,但这不是可以机械套用的口诀。本文解释递归 chmod 的风险、umask 如何影响默认权限,以及共享目录为什么常常需要 2775。

把项目部署到服务器,或者脚本跑不起来时,很多人会下意识写下 644755。问题不在于这两个数字不常用,而在于它们很容易被当成万能答案。想先弄懂数字本身,可以看什么是 chmod 755;这篇只解决一个更实际的问题:文件和目录,到底该选哪一种?

一句话规则

绝大多数情况下:

  • 普通文件 → 644rw-r--r--):所有者可读写,其他人只读。
  • 目录和需要运行的程序 → 755rwxr-xr-x):所有者可完全控制,其他人可读取并进入目录或执行程序,但不能修改。

两者只差一个执行位。文本、JSON、图片、样式表这类数据文件不需要执行,因此通常用 644;目录和程序则离不开执行位。把这一点分清,大部分权限选择就不会错。

目录上的执行位并不是“运行目录”。它表示搜索/遍历权限:可以 cd 进入,并按名称访问其中的条目。目录设为 644 时没有 x;有读取权的人可能仍看得到条目名称,但不能进入目录、不能按名称访问条目,也不能继续向下遍历。因此,644 不是可正常使用目录的默认值;把整棵目录树递归改成 644,通常就会把它弄坏。支柱文章会更完整地解释文件与目录的差异。

递归 chmod 最容易踩的坑

项目里既有文件也有子目录时,下面两条命令看似直接,实际都不对:

chmod -R 755 myproject/    # 连普通文件也会被加上执行位
chmod -R 644 myproject/    # 所有目录都会失去遍历权限

chmod -R 755 会把 README、配置文件等都标成可执行。通常不至于立刻出事,但不整洁,也会让权限审查变困难。chmod -R 644 更严重:目录没有 x,人和程序都进不去。

单一的绝对数值模式无法同时表达这两件事。如果你已检查过目录树,并且希望把普通文件的基本 rwx 位设为 644、目录的基本 rwx 位设为 755,就按类型处理:

# 按类型分别规范化:
find myproject -type f -exec chmod 644 {} +
find myproject -type d -exec chmod 755 {} +

# 另一种相对操作:补上读取和条件执行位,
# 但不改变已有的写权限
chmod -R a+rX myproject/

这两种命令不能互相替代,也不是通用修复命令。 find 的两行会按类型重设基本 rwx 位;a+rX 是相对修改,不会改变已有写位,因此原本是 777 的目录仍可能保持 777。特殊位需要单独审查;执行前必须排除 .env、私钥和部署凭据。

大写 X 很值得记住。小写 x 无条件添加执行位;大写 X 只会作用于目录,或本来就有人拥有执行位的文件。因此 chmod -R a+rX 不会把数据文件变成可执行文件,但它仍会扩大读取范围。它不会把基本 rwx 位重设为 644755,只会增加权限并保留已有写位;需要按类型重设基本 rwx 位时,应使用按类型拆分的写法。想确认某个符号操作最终会得到什么八进制权限,可以用 chmod 计算器核对。

常用权限速查

文件

模式符号形式常见用途
644rw-r--r--源码、文档、普通配置、静态资源
600rw-------SSH 私钥、.env、凭据
640rw-r-----所有者可写,指定组可读
664rw-rw-r--需要由同一组共同编辑的文件
755rwxr-xr-x所有人都可运行的脚本和二进制文件
700rwx------仅所有者可运行的私有脚本

目录

模式符号形式常见用途
755rwxr-xr-x常规目录:可进入、可列出,但不能修改
700rwx------私有目录,例如 ~/.ssh
750rwxr-x---所有者和组可用,其他人不可进入
775rwxrwxr-x组成员需要共同写入的目录

规律很简单:从常见基线开始,再有意识地调整。只自己使用时选 600700;需要让组访问时选 640750;组成员也要写入时,才有意识地增加组写权限,使用 664775。如果你想直接用 777,通常应该先检查所有权,而不是继续放宽权限。

默认权限从哪里来:umask

新建文件和目录经常“自然”变成 644755,这来自 umask。在没有默认 ACL 的常规创建场景中,程序通常会请求文件 666、目录 777,然后由 umask 去掉部分权限。常见的 022 会去掉 group 和 other 的写位:

  • 新文件:666 减去 022644
  • 新目录:777 减去 022755

严格来说 umask 做的是按位掩码而不是减法,内核算的是 666 & ~022。常见掩码下两种算法结果一致,但遇到 023 这样的值就会分叉:666 & ~023 仍是 644,按减法却会得出 643

这也解释了为什么新文件通常不可执行:文件的起始请求值 666 本来就没有执行位,umask 只能移除权限,不能增加权限。需要执行时,再明确使用 chmod +x

共享开发环境常用 umask 002,让组保留写权限:

  • 新文件:666 减去 002664
  • 新目录:777 减去 002775

这正是表中的 664775 组合。计算器的 umask 模式可以直接展示结果。注意,umask 只影响新建条目,不会回头改动磁盘上已有的文件。

共享目录只设 775 仍有缺口:新文件默认属于创建者的主组,队友未必在那个组里。给目录加 setgid 位,变成 2775,可以让新条目继承目录组。但 setgid 只解决“继承哪个组”,不会自动保留组写权限;还要配合 002 这类 umask,或设置合适的默认 ACL。支柱文章解释了第四个数字的含义。

快速决策顺序

  1. 它是文件还是目录? 文件通常从 644 开始,目录通常从 755 开始。
  2. 它需要运行吗? 脚本或二进制程序需要执行位:公开运行用 755,私有运行用 700
  3. 谁还需要访问? 只有自己用 600700;组需要读用 640750;组需要写再用 664775
  4. 要递归处理吗? 不要对混合目录树套用单一绝对数值模式。按文件/目录拆开,或在确认会扩大读取范围后使用 chmod -R a+rX
  5. 想用 777 吗? 先停一下。问题往往是所有权、父目录权限或挂载策略,而不是数字还不够大。

把文件和目录区分好,后面的选择就顺了。需要把八进制模式和 rwxr-xr-x 并排确认,或者想算 umask 的结果时,chmod 计算器可以直接展示两种形式。而如果模式已经设对、文件却依然打不开或跑不起来,问题就不在模式上了——那要顺着所有权、父目录和更下面的几层去找,chmod 之后仍然 Permission denied 就是按层排查的那一篇。