chmod 644 和 755:文件与目录该怎么选?
644 适合普通文件,755 常用于目录和可执行程序,但这不是可以机械套用的口诀。本文解释递归 chmod 的风险、umask 如何影响默认权限,以及共享目录为什么常常需要 2775。
把项目部署到服务器,或者脚本跑不起来时,很多人会下意识写下 644 或 755。问题不在于这两个数字不常用,而在于它们很容易被当成万能答案。想先弄懂数字本身,可以看什么是 chmod 755;这篇只解决一个更实际的问题:文件和目录,到底该选哪一种?
一句话规则
绝大多数情况下:
- 普通文件 →
644(rw-r--r--):所有者可读写,其他人只读。 - 目录和需要运行的程序 →
755(rwxr-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 位重设为 644/755,只会增加权限并保留已有写位;需要按类型重设基本 rwx 位时,应使用按类型拆分的写法。想确认某个符号操作最终会得到什么八进制权限,可以用 chmod 计算器核对。
常用权限速查
文件
| 模式 | 符号形式 | 常见用途 |
|---|---|---|
644 | rw-r--r-- | 源码、文档、普通配置、静态资源 |
600 | rw------- | SSH 私钥、.env、凭据 |
640 | rw-r----- | 所有者可写,指定组可读 |
664 | rw-rw-r-- | 需要由同一组共同编辑的文件 |
755 | rwxr-xr-x | 所有人都可运行的脚本和二进制文件 |
700 | rwx------ | 仅所有者可运行的私有脚本 |
目录
| 模式 | 符号形式 | 常见用途 |
|---|---|---|
755 | rwxr-xr-x | 常规目录:可进入、可列出,但不能修改 |
700 | rwx------ | 私有目录,例如 ~/.ssh |
750 | rwxr-x--- | 所有者和组可用,其他人不可进入 |
775 | rwxrwxr-x | 组成员需要共同写入的目录 |
规律很简单:从常见基线开始,再有意识地调整。只自己使用时选 600/700;需要让组访问时选 640/750;组成员也要写入时,才有意识地增加组写权限,使用 664/775。如果你想直接用 777,通常应该先检查所有权,而不是继续放宽权限。
默认权限从哪里来:umask
新建文件和目录经常“自然”变成 644 与 755,这来自 umask。在没有默认 ACL 的常规创建场景中,程序通常会请求文件 666、目录 777,然后由 umask 去掉部分权限。常见的 022 会去掉 group 和 other 的写位:
- 新文件:
666减去022→644 - 新目录:
777减去022→755
严格来说 umask 做的是按位掩码而不是减法,内核算的是 666 & ~022。常见掩码下两种算法结果一致,但遇到 023 这样的值就会分叉:666 & ~023 仍是 644,按减法却会得出 643。
这也解释了为什么新文件通常不可执行:文件的起始请求值 666 本来就没有执行位,umask 只能移除权限,不能增加权限。需要执行时,再明确使用 chmod +x。
共享开发环境常用 umask 002,让组保留写权限:
- 新文件:
666减去002→664 - 新目录:
777减去002→775
这正是表中的 664/775 组合。计算器的 umask 模式可以直接展示结果。注意,umask 只影响新建条目,不会回头改动磁盘上已有的文件。
共享目录只设 775 仍有缺口:新文件默认属于创建者的主组,队友未必在那个组里。给目录加 setgid 位,变成 2775,可以让新条目继承目录组。但 setgid 只解决“继承哪个组”,不会自动保留组写权限;还要配合 002 这类 umask,或设置合适的默认 ACL。支柱文章解释了第四个数字的含义。
快速决策顺序
- 它是文件还是目录? 文件通常从
644开始,目录通常从755开始。 - 它需要运行吗? 脚本或二进制程序需要执行位:公开运行用
755,私有运行用700。 - 谁还需要访问? 只有自己用
600/700;组需要读用640/750;组需要写再用664/775。 - 要递归处理吗? 不要对混合目录树套用单一绝对数值模式。按文件/目录拆开,或在确认会扩大读取范围后使用
chmod -R a+rX。 - 想用
777吗? 先停一下。问题往往是所有权、父目录权限或挂载策略,而不是数字还不够大。
把文件和目录区分好,后面的选择就顺了。需要把八进制模式和 rwxr-xr-x 并排确认,或者想算 umask 的结果时,chmod 计算器可以直接展示两种形式。而如果模式已经设对、文件却依然打不开或跑不起来,问题就不在模式上了——那要顺着所有权、父目录和更下面的几层去找,chmod 之后仍然 Permission denied 就是按层排查的那一篇。