不喜欢广告? 无广告 今天

chmod 的通俗解释 — 为什么每个人都会写 755 但并不知道它意味着什么

更新于

755、644、777——你已经输入过无数次了。这里解释了它们真正的含义,为什么chmod 77及777是懒惰而非邪恶,以及每个数值在什么情况下才是正确的选择。

chmod 的通俗解释——为什么每个人都会写755却不知道其含义 1
广告 移除?

在职业生涯的早期某个时刻,有人曾告诉你要运行一个目录或 chmod 755 一个配置文件。它奏效了,你继续前进。多年后,你仍然凭肌肉记忆输入那些确切的数字——而当有人问你755到底是什么意思时,你只是模糊地指向屏幕说“这是标准的权限设置。” chmod 644 这没问题,直到它不再适用。当你需要调试权限被拒绝的错误、决定新脚本的权限设置,或向初级开发者解释为什么

不是所有问题的解决方案时,凭记忆就不再够用了。 chmod 777 以下是这些数字的实际含义。

位结构

Unix文件权限由三组三位构成。就是这样。每组控制一类用户——所有者、组、其他人——每组中的每一位分别对应读取、写入或执行权限。

数值为:读取=4,写入=2,执行=1。每组将这些数值相加。因此

表示读取+写入+执行(4+2+1)。 7 表示读取+执行(4+1)。 5 表示仅读取。 4 分解

:所有者获得7(rwx),组获得5(r-x),其他人获得5(r-x)。二进制表示为:111 101 101。符号表示法为: 755默认你一直输入的值就是“所有者可以做一切,其他人只能读取和执行,不能写入。” rwxr-xr-x在任何目录中,你都会得到类似这样的结果:

读取 ls -la 输出

运行 ls -la 对于目录,

drwxr-xr-x  2 deploy www-data 4096 May 29 10:00 public_html
-rw-r--r--  1 deploy www-data 2341 May 29 09:45 config.php
-rwx------  1 deploy deploy    891 May 28 14:20 deploy.sh
-rw-------  1 deploy deploy    411 May 10 08:30 .env

第一个字符是文件类型: d 对于普通文件, - 对于符号链接。然后是三组三字符——所有者、组、其他人。减号表示权限缺失。 l 权限数字后面的值是硬链接计数。然后是所有者名称、组名称、文件大小(字节)、修改时间戳,最后是文件名。

因此

表示:目录,所有者(deploy)可读/写/执行,组(www-data)可读和遍历但不可写,其他人可读和遍历但不可写。有两个硬链接。这是你标准的Web目录。 drwxr-xr-x 2 deploy www-data 常见的权限值及其存在的原因

以下是你会实际使用的值的分解,它们的含义以及何时使用:

rwxr-xr-x

价值象征性二进制含义何时使用
755所有者:完整权限。组/其他人:读取+执行111 101 101目录、公开可执行文件、Web服务脚本rw-r–r–
644所有者:读取+写入。组/其他人:仅读取110 100 100配置文件、静态资源、HTML、PHP源文件rw——-
600所有者:读取+写入。其他人:无权限110 000 000SSH私钥(~/.ssh/id_rsa)、.env文件rwx——
700所有者:完整权限。其他人:无权限111 000 000包含机密的脚本、私有可执行文件rwxrwxrwx
777所有人:完全访问权限111 111 111/tmp、容器临时目录——几乎在其他地方都不适用目录需要执行权限的原因是,“执行”在目录上的含义是“遍历”——即能够进入目录并访问其内容。如果一个目录是

,你可以列出其中文件的名称,但无法实际访问它们。你需要“x”位才能进入目录或打开文件。这就是为什么目录使用755而不是744。 r--r--r--如果想交互式地处理这些值,可以使用

IO Tools上的chmod计算器 可以实时切换各个位,并看到八进制和符号表示值随之更新——当你需要构造一个不熟悉的权限值时非常有用。 符号表示法:何时使用它

八进制表示法一次性设置所有权限。符号表示法进行增量修改。两者都有效——选择取决于你正在做什么。

添加所有者执行权限,而不影响其他部分。如果文件当前是

chmod u+x script.sh ,这会使其变为 644。如果你使用八进制并写入 744,你也会得到相同的结果——但你需要先知道当前状态。 chmod 744 script.sh符号操作符非常直接:

添加一个权限, + 移除它, - 将其设置为精确值。目标是 = (用户/所有者), u (组), g (其他人), o (所有三类)。 a 当你希望只更改一个权限而不重置其他部分时,使用符号表示法。当你从零开始设置权限或需要完全控制最终状态时,使用八进制表示法。

chmod u+x deploy.sh          # add execute for owner
chmod g-w config.php         # remove write from group
chmod o=r public/index.html  # set others to read-only exactly
chmod a+r shared.txt         # add read for everyone

为什么新文件默认不是666

使用文本编辑器或

创建一个新文件,你会得到 touch 。创建一个目录,你会得到 644。这些默认值来自哪里? 755文件从理论上的最大值开始为

(默认不包含执行权限——必须显式设置)。目录从 666 开始,减去这些最大值。 777。的 umask 大多数Linux系统的默认umask是

。应用于文件:666 – 022 = 644。应用于目录:777 – 022 = 755。这就是为什么644和755感觉像默认值——它们在机制上就是如此。 022运行

运行 umask 不带参数来查看当前值。如果需要更严格的默认值,请在shell配置文件中修改它—— umask 027 会给你640文件和750目录,这会移除“其他人”的所有权限,仅允许组读取。

chmod 777:并非邪恶,只是懒惰

关于 chmod 777的坦率看法是:在某些场景下它并非安全灾难。在生产环境中几乎永远不是正确答案,人们使用它是因为它能立即解决权限错误,而无需深思。

在共享服务器上, chmod 777 在可写目录上意味着任何运行在任何用户下的进程——包括被攻陷的Web应用——都可以写入该目录。这是一个真实的安全漏洞。这也是“我们稍后会修复”的问题,永远留在生产环境中。

777的适当用途:

  • /tmp在临时容器中 ——没有内容持久保存,没有意义,直接继续
  • 在开发中调试权限问题 ——用它来确认是权限问题而非其他问题,然后设置正确的权限值
  • 在可信的单用户机器上的共享临时目录 ——如果你是唯一用户,“其他人”的权限是理论上的

诊断流程是:遇到权限被拒绝错误,临时应用777以确认是权限问题而非其他问题,然后确定正确的权限值并设置它。 chmod 777 作为诊断工具是完全可以接受的。 chmod 777 在部署脚本中被使用且无人再查看,这才是安全漏洞发生的根源。

值得掌握的权限值

你不需要记住每一个可能的组合。这四个值覆盖了约95%的真实世界场景:

  • 755 ——应公开访问的目录和可执行文件
  • 644 ——应被所有人读取,但仅由所有者可写入的文件
  • 600 ——敏感文件:SSH密钥、凭证、.env文件。SSH将拒绝使用权限低于600的私钥。
  • 700 ——包含机密的脚本,不应被任何人执行

当你遇到超出这个范围的情况时,从位结构入手:决定所有者、组和他人各自需要什么权限,将位相加,写出数字。此时 Chmod 计算器 会非常有用,如果你不想在压力下进行心算。

权限模型是Unix中一个看似随意的东西,直到你理解它其实只是二进制加法。一旦理解这一点,你就不再盲目模仿他人的chmod命令,而是开始有意识地设置权限——这才是目的。

想要享受无广告的体验吗? 立即无广告

安装我们的扩展

将 IO 工具添加到您最喜欢的浏览器,以便即时访问和更快地搜索

添加 Chrome 扩展程序 添加 边缘延伸 添加 Firefox 扩展 添加 Opera 扩展

记分板已到达!

记分板 是一种有趣的跟踪您游戏的方式,所有数据都存储在您的浏览器中。更多功能即将推出!

广告 移除?
广告 移除?
广告 移除?

新闻角 包含技术亮点

参与其中

帮助我们继续提供有价值的免费工具

给我买杯咖啡
广告 移除?