SSD Nodes Learn 🎉 VPS $4.99/月起
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-07

drwxr-xr-x 是什么意思?Linux 权限 755 详解

逐字符解析 drwxr-xr-x,说明目录权限为何对应 755、目录上的 x 为何表示进入或遍历,并解释为什么 chmod 777 不是正确的修复方法。

drwxr-xr-x 的含义

drwxr-xr-x 表示一个目录:其所有者可以修改目录内容,其他用户都可以读取并进入该目录,但不能修改其中的内容。用八进制表示时,该权限模式为 755。Linux 会在每行 ls -l 输出的开头显示这 10 个字符。它们始终按相同顺序表示相同含义,因此掌握这一字符串后,就能理解所有类似权限字符串。

有一条规则优先于其他规则,因为它决定了您自己的测试是否有意义。root 用户不受权限位限制。内核向 root 授予 CAP_DAC_OVERRIDE 能力(绕过自主访问控制),因此 root 可以打开权限模式禁止访问的文件。本页中的所有示例对 root 都会成功,无论权限位如何设置。要观察这些规则实际生效,请使用普通用户登录。

逐个理解这10个字符

创建一个目录和一个文件供查看。以下操作不会影响新目录以外的任何内容。

mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt

在常见的默认 umask 022 下,两个目录行以 drwxr-xr-x 开头,文件行以 -rw-r--r-- 开头。

第1个字符表示文件类型,不是权限。d 表示目录。- 表示普通文件。l 表示符号链接。cb 分别表示字符设备节点和块设备节点。s 表示套接字,p 表示命名管道。它位于八进制值之外,因此 drwxr-xr-x 会变成 755,而不是以 d 开头的值。

后面的9个字符分为3组,每组3个字符,顺序始终不变。

  • 第2至第4个字符是 owner 三元组,适用于文件所有者的权限位。
  • 第5至第7个字符是 group 三元组,适用于文件所属组的权限位。
  • 第8至第10个字符是 other 三元组,适用于其他所有用户的权限位。

在一个三元组中,各位置始终依次表示 rwx;短横线表示对应权限位未启用。字母的位置不会改变。r-x 表示可读但不可写。-w- 表示可写但不可读,这是合法但少见的权限组合。

因此,drwxr-xr-x 可拆分为:目录的 d,所有者的 rwx,所属组的 r-x,以及其他用户的 r-x

某些系统会显示第11个字符。末尾的点号 drwxr-xr-x. 表示文件带有 SELinux(security enhanced Linux)上下文。Fedora 和 Rocky 等 SELinux 发行版默认会显示该字符。末尾的加号 drwxr-xr-x+ 表示文件带有 POSIX ACL(access control list),即除这9个权限位之外的另一组规则。使用 getfacl <path> 查看这些额外规则。

目录上的 r、w 和 x 作用不同

这是初学者最容易理解错误的规则。文件和目录使用相同的字母,但它们授予的权限不同。

  • 文件上的 r 用于读取内容。目录上的 r 用于列出其中的名称,普通的 ls 需要此权限。
  • 文件上的 w 用于修改内容。目录上的 w 用于在其中添加和删除目录项。删除文件会修改目录,因此决定是否可以删除文件的是目录的写权限,文件自身的权限模式不起作用。
  • 文件上的 x 用于将其作为程序运行。目录上的 x 用于遍历目录,也就是内核可以在路径查找过程中解析其中的一个名称。

遍历是最容易让人困惑的部分。目录上的 x 不会执行任何操作。打开 /srv/site/index.html 需要对 / 具有 x,然后对 /srv 具有 x,再对 /srv/site 具有 x,最后对文件具有 r。如果路径中的某个目录缺少您所需的 x,查找就会在那里停止。即使路径末尾的文件对所有用户可读,调用方仍会针对整个路径收到 Permission deniednamei -l /srv/site/index.html 会以模式和所有者信息显示路径链中的每一步,因此您可以看到具体在哪一环停止。

目录具有 r 但没有 x 时,会处于一种值得识别的异常中间状态。普通用户可以列出名称,因为列出名称由 r 授予;但无法对任何目录项执行 stat,因此 ls -l 会在大小和模式列中填入问号,并为每个目录项打印 ls: cannot access ...: Permission denied

将字母形式转换为 755

每组三个位表示一个三位二进制数。r 为 4,w 为 2,x 为 1。将已启用的位相加。

  • rwx 为 4 + 2 + 1 = 7
  • rw- 为 4 + 2 = 6
  • r-x 为 4 + 1 = 5
  • r-- 为 4
  • --- 为 0

因此,drwxr-xr-x 对所有者为 7、对组为 5、对其他用户为 5,即 755。-rw-r--r-- 为 6、4、4,即 644。drwxrwxr-x 为 7、7、5,即 775;它相当于在 755 的基础上为组添加写权限。您无需手动计算字符,因为 stat 会同时显示这两种形式。

stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt

%A 是字母形式,%a 是八进制形式,%U%G 分别表示所有者用户和所有者组。

人们经常搜索的权限字符串

下面列出实际服务器上常见的权限模式、对应的八进制值,以及它们的典型用途。

  • -rw-r--r--为 644。服务只需读取的普通文件,例如配置文件或 HTML 页面。
  • -rw-------为 600。机密文件,例如 SSH 私钥或应用的 .env文件。
  • -rw-rw-r--为 664。位于组共享目录中的文件,组内成员需要写入该文件。
  • -rwxr-xr-x为 755。脚本和二进制文件,例如 /usr/local/bin/backup.sh以及大多数 /usr/bin
  • -rwx------为 700。只有所有者可以运行的私有脚本。
  • drwxr-xr-x为 755。几乎所有系统目录,以及网站的文档根目录。
  • drwx------为 700。~/.ssh,以及安全加固服务器上的主目录。
  • drwxrwxr-x为 775。所有者所属的组可以写入的目录。
  • drwxrwsr-x为 2775。与上面相同,但还设置了 setgid 位,因此其中新建文件会继承该目录的组。
  • drwxrwxrwt为 1777。/tmp。末尾的 t是 sticky 位,因此用户只能删除自己的文件。
  • -rwsr-xr-x为 4755。以所有者身份运行的 setuid 二进制文件,例如 /usr/bin/passwd/usr/bin/sudo
  • -rw-rw-rw-为 666,drwxrwxrwx为 777。全局可写。在服务器上,这几乎总是错误配置。
  • lrwxrwxrwx是所有符号链接显示的权限字符串。Linux 会忽略链接上的权限位并检查目标,因此该字符串完全没有实际意义。

适用您的权限三元组

这是初学者容易弄错的第二条规则。内核只选择一个三元组,然后停止判断。

如果您的用户 ID 与文件所有者匹配,您使用所有者三元组,内核不会再检查组和其他用户的权限位。否则,如果文件所属的组是您所属的组之一,您使用组三元组。否则,您使用其他用户三元组。

这会带来两点结论。即使所有者三元组的限制最严格,它仍然优先适用。模式为 0466 的文件显示为 -r--rw-rw-:所有者只有读权限,而其他所有人都可以写入,因为所有者检查首先匹配,后续权限位不会再读取。这种权限设置是合法的,但初次遇到时通常会令人困惑。

接下来,组三元组由文件所属的组决定,而不是由您所属的组列表决定。ls -l 每行打印两个名称:先是所有者,再是组。只有第二个组对该文件的权限判断有影响。您属于 20 个组,只有当文件所属的组是其中之一时才有帮助。

id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txt

id 打印您的用户和您所属的所有组。stat 打印文件的所有者和所属组。比较两者,即可确定内核会为您使用哪个三元组。

因此,共享目录通常会设置一个组和 setgid 位。sudo chmod 2775 /srv/shared 显示为 drwxrwsr-x,之后在其中创建的文件会继承目录所属的组,而不是创建者的个人组,因此其他用户仍然可以写入这些文件。为每个服务分配独立账户是这一方案的另一部分,详见 VPS 上为每个服务使用一个 Linux 用户

umask 决定每个新文件的权限模式

新文件的权限模式不是由您直接指定的。它取决于创建该文件的程序请求的模式,并清除其中被 umask 屏蔽的权限位。umask 是用于移除权限位的掩码,因此 umask 越大,创建的文件越私有。

大多数发行版默认使用 022。创建普通文件的程序会请求 0666,创建目录的程序会请求 0777。umask 会从这两个请求中清除 022,因此文件的权限为 644,目录的权限为 755。全新 VPS 中到处都能看到这组权限。

umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdir

umask -S 会以字母形式输出相同的值,比 0022 更易于阅读。在 ~/.profile 中设置 umask 027,可使用更严格的默认值:文件为 640,目录为 750。这样,您的组可以读取您的工作文件,其他用户则无法访问。

需要注意两个限制。umask 只能清除权限位,不能添加权限位。因此,无论如何设置 umask,新创建的文件都不会自动具有执行权限。另一个限制是,systemd 服务不会读取您的 shell 配置文件,因此应直接在 unit 文件中设置该值。

[Service]
UMask=0027

为什么 Web 文件使用 644、Web 目录使用 755

Web 服务器使用独立账户运行。在 Debian 和 Ubuntu 上,该账户是 www-data;在 Rocky 和 Alma 上是 nginx。该进程需要读取所提供的文件,并遍历文件所在路径上的目录。它没有理由写入这些文件,静态站点更不应允许这种操作。

文件权限为 644 时,所有者拥有写权限,其他用户拥有读权限。因此,部署用户可以发布内容,Web 用户可以提供内容。目录权限为 755 时,所有者拥有写权限,其他用户拥有遍历权限。因此,Web 用户可以沿路径访问文件,但不能添加或删除任何内容。这样,即使应用程序存在错误,也无法重写它正在提供的页面。

遍历权限会在这里直接导致问题。如果站点位于 /home/deploy/site 中,而 /home/deploy 的权限为 750,Web 用户将完全无法进入该主目录,请求最终返回 HTTP 403,并在 /var/log/nginx/error.log 中出现类似以下内容的一行:

open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5

其中的 13 表示 EACCES,即内核拒绝了权限请求。网络没有问题:端口正在监听,请求也已经到达。正因为如此,在学习 Linux 上监听端口的工作方式 时,这个问题很容易令人困惑。运行 namei -l /home/deploy/site/index.html,沿路径向下检查,找到第一个不包含 x 的目录。

应用程序需要写入的目录(例如上传路径)是例外。应通过所有权授予该目录写权限,而不是扩大权限模式:sudo chown -R www-data:www-data /srv/site/uploads,并将权限模式保持为 755。只对确实需要写入的那个目录保留写权限。

chmod,不要扁平化整个目录树

chmod有两种形式。八进制形式一次设置全部 9 个权限位:chmod 644 notes.txt。符号形式只修改明确指定的权限,其余权限保持不变:chmod u+x deploy.sh为所有者添加执行权限,chmod go-w notes.txt移除组用户和其他用户的写入权限。

递归操作可能破坏目录树。chmod -R 755 .会将每个图像文件和配置文件都标记为可执行,因为 chmod无法区分脚本和 JPEG 文件。请改用大写的 X

chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt

大写的 X会为目录设置执行权限,并保留原本任一位置已有执行权限的文件的执行权限。目录最终为 755,普通文件最终为 644,原本已可执行的脚本仍保持可执行。已有一个权限模式符合要求的文件时,chmod --reference=good.sh other.sh会将其权限复制到其他文件。

错误权限位会显示的消息

bash: ./deploy.sh: Permission denied表示脚本在适用的权限三元组中没有 x 权限位,或者其路径中的某个目录没有 x 权限位。chmod u+x deploy.sh 可修复第一种情况。

bash: ./deploy.sh: cannot execute: required file not found表示另一种故障,但名称容易造成误解。x 权限位正常,而第一行指定的解释器不存在。通常原因是 Windows 换行符,导致内核查找名为 /bin/bash\r 的解释器。使用 sed -i 's/\r$//' deploy.sh 修复。

Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. 来自 SSH 客户端,因为其他账户可以读取私钥时,客户端会拒绝使用该密钥。密钥需要 600 权限,~/.ssh 需要 700 权限。完整的密钥处理说明请参阅管理 SSH 密钥及其文件权限

当 home 目录或其 .ssh 具有组写权限时,服务器的日志中会出现 Authentication refused: bad ownership or modes for directory /home/deploy/.ssh。sshd 的 StrictModes 设置会拒绝该密钥,而从客户端看,这会表现为没有任何解释的异常密码提示。

sudo: /etc/sudoers is world writable 后跟 sudo: no valid sudoers sources found, quitting,表示 sudo 检查了自身配置文件的权限模式,并拒绝运行。该文件必须具有 0440 权限。这通常是广泛递归执行 chmod 后的结果,也可能与上面的 sshd 消息同时出现。此时,服务提供商的控制台可能是唯一的恢复途径。

为什么 777 不是解决方案

777 会向机器上的每个账户,以及以这些账户身份运行的每个进程授予写入权限。服务器会让服务以各自的用户身份运行,因此在 VPS 上,“所有人”涵盖的范围远大于笔记本电脑。遭到入侵的服务可以写入所有允许 777 写入的位置。

在 Web 根目录下,危害会直接发生。服务器同时提供该目录内容时,任何用户可写的目录都会使文件上传漏洞变成植入脚本并再次请求该脚本的途径。

对于所有权问题,777 几乎总是错误的答案。表象是“应用无法写入此目录”。原因是该目录属于错误的用户。sudo chown -R appuser:appuser /srv/app/storage 配合模式 755 即可解决问题,同时阻止其他所有账户访问。应在部署任何内容之前创建这些账户,这属于新 VPS 上线后的前十分钟

在一个常见位置使用全局写入权限是合理的,即 /tmp,其权限写法是 drwxrwxrwt。末尾的 t 是 sticky bit:目录对所有用户可写,但用户只能删除自己拥有的文件。没有这个位,任何账户都可以删除其他账户的临时文件。

更改模式前先读取现有模式

这些命令只读取状态,因此可以在任何位置安全运行。

id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002

find <path> -perm -0002 会列出路径下所有设置了其他用户写入位的项。这是在有人使用 chmod 777 修复系统后审计主机的最快方法。

要确认某个服务账户能否进入目录,请以该账户身份进行检查。sudo -u www-data test -x /srv/site && echo yes || echo no 会在该用户拥有目录遍历权限时输出 yes,没有该权限时输出 no。以 root 身份检查没有意义,因为 root 会跳过此检查,结果始终是 yes

FAQ

Linux 中的 drwxr-xr-x 表示什么?

它是一个目录,开头的 d 表明了这一点,权限模式为 755。所有者三元组为 rwx,因此所有者拥有该目录的全部权限。组权限三元组为 r-x,其他用户三元组为 r-x,因此其他所有用户都可以列出其中的名称并遍历该目录,但只有所有者可以添加或删除内容。使用 stat -c '%A %a %U %G %n' <path> 可确认任意路径;该命令会并排输出字母形式和八进制形式。

为什么 Web 文件的权限是 644,而 Web 目录的权限是 755?

Web 服务器使用不同的账户运行。在 Ubuntu 上,该账户是 www-data。它需要读取所提供的文件,并遍历文件上层的每个目录,但没有理由对文件或目录执行写入操作。644 允许所有者写入,其他用户读取。755 允许所有者写入,其他用户遍历。应用确实需要写入的目录,应使用 chown 将其交给该应用的用户,而不是放宽权限模式,让所有用户都能写入。

x 位表示我可以执行目录吗?

不是。在目录上,x 表示遍历权限,也就是内核解析路径时解析其中一个名称的权限。cd 需要该权限,打开目录下文件时也需要该权限。路径中的每个目录都需要 x,因此即使文件权限模式为 644,如果上层目录缺少你所需的 x,仍然无法访问该文件。namei -l /path/to/file 会输出路径中每个目录的权限模式,从而显示路径解析在哪一级停止。

chmod 777 是否有可能是正确的修复方法?

在服务器上几乎从来不是。它会向机器上的每个账户授予写入权限,包括服务运行所使用的账户,因此一个已被入侵的服务就可以重写该文件。应用无法写入目录时,真正的问题通常是所有权:使用 sudo chown -R appuser:appuser /srv/app/storage 并设置权限模式 755,可以满足应用的需求,同时阻止其他用户写入。常见的例外是 /tmp 设置为 1777;它之所以可行,是因为粘滞位会阻止用户删除其他用户的文件。

为什么 ls 会在权限后输出点号或加号?

第 11 个字符表示超出 9 个权限位的其他规则。点号(如 drwxr-xr-x.)表示附加了 SELinux 安全上下文,这在 Fedora 和 Rocky 上很常见。加号(如 drwxr-xr-x+)表示设置了 POSIX ACL(访问控制列表),因此某些用户或组拥有三元组中未显示的权限。运行 getfacl <path> 可列出这些额外条目。

#permissions#ls#chmod#linux-basics#octal