[Linux权限入门] ls -l看不懂?chmod与chown详解:彻底搞懂文件权限

[Linux权限入门] ls -l看不懂?chmod与chown详解:彻底搞懂文件权限

“嘿,我在 Linux 服务器上想改个文件,结果系统提示我‘Permission denied’,这是咋回事?” “我用 ls -l 命令看了一下,出来一堆像 -rw-r--r-- 或者 drwxr-xr-x 这样的乱码,完全看不懂啊!”

如果你也曾被这些问题困扰过,那么恭喜你,你已经触及到了 Linux 系统管理中一个至关重要的核心概念——文件权限。这套机制,初看起来可能有点像天书,但它其实是 Linux 系统安全的基石,也是你作为服务器管理员或开发者必须掌握的基本功。它就像是你服务器里的一套精密的“门禁系统”,明确规定了谁能进哪个“房间”(文件或目录),以及进去之后能干什么(读、写、还是运行程序)。

理解了文件权限,你就能:

  • 知道为什么有些文件你能修改,有些却动不了。
  • 确保你的网站文件和敏感数据不被未经授权的用户访问或篡改。
  • 让你的脚本和程序能够正常执行,而不会因为权限不足而罢工。
  • 更自信地管理你的服务器,避免很多常见的安全风险。

这篇“保姆级”指南,就是要帮你彻底扫清 Linux 文件权限的认知障碍。我们会先从解读那个让人头疼的 ls -l 输出入手,然后手把手教你使用 chmod 命令来像“魔术师”一样改变文件和目录的访问权限,再学习用 chown 命令来变更它们的“主人”。准备好了吗?让我们一起打开 Linux 权限世界的大门!

“第一道安检门”:理解 Linux 文件权限的基本概念

在看懂 ls -l 的输出之前,我们先得认识几个基本“角色”和“动作”。

1. 文件类型 (File Type): ls -l 输出的第一个神秘字符

当你执行 ls -l 命令时,每一行列出的文件或目录信息,开头的第一个字符就代表了它的“身份类别”:

  • - : 代表这是一个**普通文件 (Regular file)**。比如文本文件、图片、视频、二进制可执行程序等。
  • d : 代表这是一个**目录 (Directory)**。目录就像是文件夹,里面可以包含其他文件和子目录。
  • l : 代表这是一个**符号链接 (Symbolic link)**,也叫软链接。它就像是 Windows 里的“快捷方式”,指向另一个文件或目录。
  • c : 代表这是一个**字符设备文件 (Character device file)**。比如你的终端 (/dev/tty)。
  • b : 代表这是一个**块设备文件 (Block device file)**。比如你的硬盘或分区 (/dev/sda, /dev/sdb1)。
  • s : 代表这是一个**套接字文件 (Socket file)**。用于进程间通信。
  • p : 代表这是一个**命名管道文件 (Named pipe / FIFO)**。也用于进程间通信。

对于我们日常管理服务器和网站来说,最常打交道的就是前三种:普通文件 (-)、目录 (d)、和偶尔会用到的符号链接 (l)。

2. 权限“三剑客”:读 (r)、写 (w)、执行 (x)

这三个字母是权限的核心,它们分别代表:

  • 读 (r – Read):
    • 对于文件:表示可以查看文件的内容。
    • 对于目录:表示可以列出目录中包含的文件和子目录名列表(比如用 ls 命令查看目录内容)。
  • 写 (w – Write):
    • 对于文件:表示可以修改文件的内容(增加、删除、改变)。
    • 对于目录:表示可以在该目录中**创建新文件或子目录、删除已存在的文件或子目录、以及重命名文件或子目录**。注意: 要删除一个文件,你需要的不是对该文件本身的写权限,而是对该文件所在目录的写权限!这是很多新手容易混淆的地方。
  • 执行 (x – Execute):
    • 对于文件:表示可以将该文件作为程序来运行。比如 Shell 脚本、编译好的二进制程序等,都需要有执行权限才能跑起来。
    • 对于目录:表示可以进入 (cd) 该目录。如果你想访问一个目录内部的文件,你不仅需要对该目录有读权限(才能看到里面有什么),还需要有执行权限(才能“走进去”)。

这“三剑客”的行为,对于文件和目录的含义是不同的,务必区分清楚!

3. 三类“访客”:所有者 (User/Owner)、所属组 (Group)、其他人 (Others)

Linux 系统中的每一个文件和目录,都明确定义了它属于谁,以及哪些人可以对它做什么。权限的授予对象主要分为三类:

  • 所有者 (User / Owner – 通常用 u 表示): 创建文件或目录的用户,就是它的所有者。所有者通常拥有对该文件/目录的最高控制权。
  • 所属组 (Group – 通常用 g 表示): 每个文件或目录都会被分配给一个用户组。这个组里的所有用户成员,通常会享有该文件/目录的“组权限”。这是一种方便给一组人授予相同权限的方式。
  • 其他人 (Others – 通常用 o 表示): 既不是文件所有者,也不属于文件所属组的所有其他用户,就归为“其他人”。他们通常拥有最低的权限。

你可以把这想象成你家的一套“门禁规则”:你自己(所有者)肯定有所有房间的钥匙;你的家人(所属组)可能有大部分房间的钥匙;而普通的访客(其他人)可能只被允许进入客厅或特定区域。还有一个特殊角色是 root 超级用户,它在 Linux 系统里拥有至高无上的权力,几乎可以忽略所有权限限制(当然,这也是为什么我们不推荐日常使用 root 操作的原因)。

“火眼金睛”:解读 ls -l 输出的权限字符串

好了,有了以上基础概念,我们再来看 ls -l 命令的输出,就没那么神秘了!当你执行 ls -l 时,你会看到类似这样的输出:

[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]


drwxr-xr-x  2 john developers 4096 May 19 10:00 my_directory
-rw-r--r--  1 john developers 1024 May 18 15:30 my_file.txt
lrwxrwxrwx  1 john developers   20 May 19 10:05 my_link -> /path/to/original

我们重点关注每行开头的那串由10个字符组成的权限描述,比如 drwxr-xr-x-rw-r--r--。这10个字符,我们可以把它分成四段来看:

  • 第1个字符:文件类型。 正如我们前面说的,d 代表目录,- 代表普通文件,l 代表符号链接。
  • 第2、3、4个字符:所有者 (User) 的权限。 顺序固定是 读(r)、写(w)、执行(x)。如果某个权限有,就显示对应的字母;如果没有,就显示一个减号 -
    • rwx: 所有者拥有读、写、执行全部权限。
    • rw-: 所有者拥有读、写权限,但没有执行权限。
    • r-x: 所有者拥有读、执行权限,但没有写权限。
    • r--: 所有者只有读权限。
    • ---: 所有者没有任何权限 (很少见)。
  • 第5、6、7个字符:所属组 (Group) 的权限。 格式和含义与所有者权限完全一样,只是它描述的是文件所属组的成员对该文件/目录拥有的权限。
  • 第8、9、10个字符:其他人 (Others) 的权限。 格式和含义也完全一样,描述的是除了所有者和所属组成员之外的其他所有用户拥有的权限。

所以,我们来解读一下上面的例子:

  • drwxr-xr-x (my_directory):
    • d: 这是一个目录。
    • rwx (所有者): 用户 john 对这个目录有读、写、执行权限。
    • r-x (所属组): 属于 developers 组的用户对这个目录有读、执行权限,但没有写权限。
    • r-x (其他人): 其他所有用户对这个目录也有读、执行权限,但没有写权限。
    (这通常是目录的常见权限设置 755,我们稍后会讲到数字模式。)
  • -rw-r--r-- (my_file.txt):
    • -: 这是一个普通文件。
    • rw- (所有者): 用户 john 对这个文件有读、写权限,但没有执行权限。
    • r-- (所属组): 属于 developers 组的用户对这个文件只有读权限。
    • r-- (其他人): 其他所有用户对这个文件也只有读权限。
    (这通常是普通文本文件的常见权限设置 644。)
  • lrwxrwxrwx (my_link):
    • l: 这是一个符号链接。对于符号链接本身,其权限通常不太重要(通常是 rwxrwxrwx),实际访问时的权限取决于它所指向的源文件/目录的权限。

ls -l 输出的其他列分别表示:链接数、所有者用户名、所属组名、文件大小(字节)、最后修改时间、以及文件名。

怎么样,是不是感觉那串“天书”开始变得有意义了?

“权限魔术棒”之一:chmod – 修改文件/目录的访问权限

看懂了权限,接下来我们就要学习如何修改权限了。chmod (change mode) 命令就是你的第一根“权限魔术棒”,它能让你改变文件或目录的读、写、执行权限。

chmod 有两种主要的用法:**符号模式 (Symbolic Mode)** 和 **数字模式 (Octal/Numeric Mode)**。

模式一:符号模式 (Symbolic Mode) – 更直观易懂,适合精确调整

符号模式的语法像是在“说话”,比较好理解。基本格式是:

chmod [针对谁][操作符][什么权限] 文件或目录名

  • 针对谁 (Who):
    • u : user,代表文件/目录的所有者。
    • g : group,代表文件/目录的所属组。
    • o : others,代表其他人。
    • a : all,代表所有三者(等同于 ugo)。如果省略这一部分,默认通常也是针对所有者。
  • 操作符 (Operator):
    • + : 添加指定的权限。
    • - :移除指定的权限。
    • = : 精确设置权限(先清除原有权限,再赋予指定的权限)。
  • 什么权限 (Permission):
    • r : 读权限。
    • w : 写权限。
    • x : 执行权限。
    • X (大写X): 特殊的执行权限。它只对目录或者已经至少对某类用户(所有者、组、或其他人)拥有执行权限的文件添加执行权限。这在递归修改目录权限时很有用,可以避免给目录下的所有普通文件都意外地加上执行权限。
    • s : SUID 或 SGID 特殊权限(见后文)。
    • t : Sticky Bit 特殊权限(见后文)。

实战演练:

  • 给脚本文件 myscript.sh 的所有者添加执行权限: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] chmod u+x myscript.sh
  • 移除文件 important_data.txt 所属组的写权限: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] chmod g-w important_data.txt
  • 设置文件 public_info.txt 其他人的权限为只读(清除其他权限): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] chmod o=r public_info.txt
  • 给目录 my_project/ 及其下所有内容(递归操作 -R)的所有者和所属组添加读写权限,并给其他人只读权限: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] chmod -R ug+rw,o=r my_project/ (这里用逗号分隔了多个权限设置)
  • 给目录 web_files/ 及其下所有子目录添加执行权限(允许进入),并给所有者添加读写,组和其他人只读(对文件不加执行权限): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] # 先给所有者读写,组和其他人读 sudo find web_files/ -type f -exec chmod 644 {} \; # 文件644 sudo find web_files/ -type d -exec chmod 755 {} \; # 目录755 # 或者用 chmod -R u=rwX,go=rX web_files/ (X 对目录和已有x的文件加x)

符号模式的优点是直观,可以精确地添加或删除某个特定权限,而不用关心其他权限是什么。

模式二:数字模式 (Octal/Numeric Mode) – 更简洁高效,适合整体设置

数字模式使用三位八进制数字(0-7)来一次性设置所有者、所属组、其他人的全部权限。这种方式更简洁,在很多脚本和文档中也更常见。

原理是这样的:

  • 读 (r) 权限对应数字 4
  • 写 (w) 权限对应数字 2
  • 执行 (x) 权限对应数字 1
  • 没有任何权限是 0

将这三个权限对应的数字相加,就能得到一个0到7之间的数字,代表了某一类用户(所有者、组、或其他人)的权限组合:

  • --- = 0 + 0 + 0 = 0 (无任何权限)
  • --x = 0 + 0 + 1 = 1 (只有执行权限)
  • -w- = 0 + 2 + 0 = 2 (只有写权限)
  • -wx = 0 + 2 + 1 = 3 (有写和执行权限)
  • r-- = 4 + 0 + 0 = 4 (只有读权限)
  • r-x = 4 + 0 + 1 = 5 (有读和执行权限)
  • rw- = 4 + 2 + 0 = 6 (有读和写权限)
  • rwx = 4 + 2 + 1 = 7 (有读、写、执行全部权限)

然后,我们用三个这样的数字,分别代表**所有者、所属组、其他人**的权限。例如:

  • chmod 755 script.sh:
    • 所有者 (7 = rwx): 拥有读、写、执行权限。
    • 所属组 (5 = r-x): 拥有读、执行权限。
    • 其他人 (5 = r-x): 拥有读、执行权限。
    (这通常是可执行脚本或目录的推荐权限)
  • chmod 644 data.txt:
    • 所有者 (6 = rw-): 拥有读、写权限。
    • 所属组 (4 = r–): 只有读权限。
    • 其他人 (4 = r–): 只有读权限。
    (这通常是普通文本文件或网页文件的推荐权限)
  • chmod 700 private_directory/:
    • 所有者 (7 = rwx): 拥有全部权限。
    • 所属组 (0 = —): 没有任何权限。
    • 其他人 (0 = —): 没有任何权限。
    (这通常是私密目录的推荐权限,如用户的 ~/.ssh 目录)
  • chmod 600 private_key.pem: (所有者读写,其他无权限,SSH私钥推荐)
  • chmod 777 very_bad_idea/: (所有人都有全部权限,极其不安全,除非你非常清楚自己在做什么,否则永远不要用!)

同样,可以配合 -R 参数递归地修改目录及其下所有内容的权限。

数字模式的优点是简洁,一条命令就能设定好三类用户的完整权限。缺点是需要你记住数字和权限的对应关系,并且它是一次性“覆盖”所有权限,不如符号模式那样可以精确地“添加”或“删除”某个单一权限。

特殊权限:SUID, SGID, Sticky Bit (简单了解,高级话题)

除了基本的 rwx 权限,Linux 还有三种特殊的权限位,它们通常用于一些特定的系统场景,这里我们简单了解一下,新手一般用不到,也不建议随意设置:

  • SUID (Set User ID – sS 出现在所有者执行权限位):
    • 当一个可执行文件设置了 SUID 位后,任何用户在运行这个文件时,该进程会临时获得文件**所有者**的权限,而不是运行者自身的权限。
    • 比如 passwd 命令就有 SUID 位,并且所有者是 root。这样普通用户才能通过它修改自己的密码(因为修改密码文件需要 root 权限)。
    • 符号模式设置:chmod u+s filename。数字模式:在三位八进制数前再加一位,第一位设为 4 (如 chmod 4755 filename)。
    • 安全风险: SUID 程序如果本身有漏洞,可能被用来提权,非常危险,系统中的 SUID 程序越少越好。
  • SGID (Set Group ID – sS 出现在所属组执行权限位):
    • 当一个可执行文件设置了 SGID 位后,运行它时进程会获得文件**所属组**的权限。
    • 当一个**目录**设置了 SGID 位后,任何用户在该目录下创建的新文件或子目录,其所属组会自动继承该目录的所属组,而不是创建者的主组。这对于团队共享目录非常有用。
    • 符号模式设置:chmod g+s itemname。数字模式:第一位设为 2 (如 chmod 2755 directory)。
  • Sticky Bit (粘滞位 – tT 出现在其他人执行权限位):
    • 粘滞位通常只对**目录**有意义。当一个目录设置了粘滞位后,即使其他用户对该目录拥有写权限(可以在里面创建文件),他们也**只能删除自己创建的文件**,而不能删除或重命名其他用户在该目录下创建的文件(除非他是该文件的所有者,或者是目录的所有者,或者是 root)。
    • 最典型的例子就是系统的 /tmp 目录,它通常权限是 1777 (drwxrwxrwt),允许所有用户写入临时文件,但粘滞位确保了用户之间不能互相删除对方的临时文件。
    • 符号模式设置:chmod +t directory。数字模式:第一位设为 1 (如 chmod 1777 directory)。

对于这些特殊权限,如果你不完全理解它们的含义和潜在的安全影响,请不要随意设置!

“权限魔术棒”之二:chown – 修改文件/目录的“户主”和“家庭成员”

学会了用 chmod 修改“能做什么”(权限),我们还需要学习用 chown (change owner) 命令来修改“谁能做”(所有者和所属组)。有时候,一个文件的权限模式可能没问题,但它的“主人”不对,导致你还是无法按预期操作。

比如,你用 root 用户从别处复制了一些网站文件到 /var/www/html/,这些文件的所有者默认就是 root。但你的 Web 服务器(如 Nginx)通常是以一个低权限用户(如 www-data)运行的,如果 www-data 对这些 root 拥有的文件没有读取权限,网站就可能打不开。这时就需要用 chown 把这些文件的所有者改成 www-data

chown 命令通常需要 sudo 权限才能执行,因为改变文件所有权是一个特权操作。

基本语法:

  • 只改变所有者:sudo chown 新所有者用户名 文件或目录名
  • 只改变所属组:sudo chown :新所属组名 文件或目录名 (注意用户名前面的冒号 :)
  • 同时改变所有者和所属组:sudo chown 新所有者用户名:新所属组名 文件或目录名

常用选项:

  • -R (Recursive – 递归): 这是操作目录时**几乎必用**的选项!它会将指定的目录及其下包含的**所有**文件和子目录的所有者/组都一并修改。如果你只对一个目录用了 chown 而不加 -R,那么只有目录本身的所有者/组变了,里面的文件还保持原样,通常不是你想要的。
  • -v (verbose): 显示详细的操作过程。

实战演练:

  • 将文件 myfile.txt 的所有者修改为用户 jane: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo chown jane myfile.txt
  • 将目录 project_files/ 的所属组修改为 developers (不改变所有者): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo chown -R :developers project_files/ (注意 -R 用于递归)
  • 将网站根目录 /var/www/mywebsite/ 及其下所有内容的所有者和所属组都修改为 www-data: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo chown -R www-data:www-data /var/www/mywebsite/ 这是配置 Web 服务器时非常非常常用的命令!

chown 命令是你调整文件“归属权”的得力助手。

实战演练:常见场景下的权限设置参考

理论学了不少,我们来看几个实际场景下推荐的权限设置:

  • Web 服务器的网站根目录 (例如 /var/www/html/var/www/yourdomain.com/public_html):
    • 所有权: 通常应该将整个网站目录的所有者和所属组都设为 Web 服务器运行的用户和组(如 www-data:www-datanginx:nginx)。 sudo chown -R www-data:www-data /var/www/yourdomain.com/public_html
    • 目录权限: 通常设为 755 (drwxr-xr-x)。这意味着 www-data 用户可以读、写、进入目录;同组用户和其他用户可以读和进入目录。
    • 文件权限 (HTML, CSS, JS, 图片等静态文件): 通常设为 644 (-rw-r--r--)。www-data 用户可读可写(方便通过 CMS 后台修改或主题编辑器),其他用户只读。
    • PHP 等脚本文件: 通常也是 644。PHP 文件是由 PHP 解释器(以 www-data 用户身份运行)读取并执行的,它本身不需要文件系统层面的执行 (x) 权限。
    • 需要被 Web 应用写入的目录 (如上传目录 uploads/, 缓存目录 cache/): 这些目录需要允许 www-data 用户写入。在所有权是 www-data:www-data 的前提下,目录权限设为 755 或更严格的 775 (如果组也需要写) 通常就够了。避免使用 777
  • 用户家目录 (/home/username/) 中的私密文件和脚本:
    • 私密目录 (如 ~/.ssh/): 权限必须是 700 (drwx------),只有所有者可访问。
    • 私密文件 (如 ~/.ssh/authorized_keys, ~/.ssh/id_rsa): 权限必须是 600 (-rw-------),只有所有者可读写。SSH 对这些权限要求非常严格!
    • 用户自己的可执行脚本 (如 ~/myscript.sh): 如果只有你自己需要运行,权限设为 700 (-rwx------) 或 744 (-rwxr--r--) 都可以。
  • 团队共享的目录: 比如你有一个目录 /shared_project/,希望 project_team 组的所有成员都能在里面读写文件,而其他用户只能读取。
    • 先将目录的所属组改为 project_team: sudo chown -R :project_team /shared_project/
    • 然后设置权限,比如目录 775 (drwxrwxr-x),文件 664 (-rw-rw-r--)。
    • 为了让在该目录下新创建的文件和子目录自动继承 project_team 组,可以给该目录设置 SGID 位:sudo chmod g+s /shared_project/。这样,任何人在里面创建的新东西,所属组都会是 project_team

具体的权限设置需要根据实际应用场景和安全需求来灵活调整,核心原则是**“最小权限够用即可”**。

结论:掌握权限,“锁”定安全,“解锁”你的 Linux 自由

呼!关于 Linux 文件权限的这趟“入门之旅”差不多就到这里了。从解读 ls -l 那串神秘字符,到学会使用 chmod 这根“权限魔术棒”的符号和数字模式,再到掌握用 chown 来变更文件“户主”,你是不是感觉自己对 Linux 系统的理解又深入了一层?

记住,文件权限是 Linux 系统安全的基石,也是你作为服务器管理员或开发者必须熟练掌握的核心技能。它就像是一套精密的“门禁和钥匙管理系统”:

  • ls -l 来**查看**每个“房间”和“物品”的“门禁规则”和“归属”。
  • chmod 来**修改**这些“门禁规则”,决定谁(所有者、组、其他人)能对它们进行哪些操作(读、写、执行)。
  • chown 来**变更**“房间”和“物品”的“户主”和“家庭成员”。

理解并善用它们,你就能为你的服务器数据和应用程序“锁”上坚固的安全之门,同时又能为你自己和需要的服务“解”开顺畅操作的自由之路。这门“手艺”需要多练习、多思考,在实际操作中不断加深理解。祝你在 Linux 的世界里玩得开心,也玩得安全!


还有疑问?常见问题解答 (FAQs)

  1. 问: 什么是 umask?它和文件权限有什么关系? 答: umask (user file-creation mode mask) 是一个非常有用的 Shell 内建命令或系统设置,它用来决定新创建的文件和目录的**默认初始权限**。它不是直接设置权限,而是设置一个“掩码”,从文件或目录的“理论最大权限”中“减掉”这个掩码对应的权限。比如,文件的理论最大权限是 666 (rw-rw-rw-),目录是 777 (rwxrwxrwx)。如果你的 umask022,那么新创建的文件默认权限就是 666 - 022 = 644 (rw-r--r--),新目录默认权限就是 777 - 022 = 755 (rwxr-xr-x)。合理设置 umask (通常在 /etc/profile 或用户的 .bashrc 中设置) 可以确保新创建的文件和目录从一开始就拥有一个相对安全的默认权限,减少后续手动修改的麻烦。
  2. 问: 我用 chmodchown 修改文件权限或所有者时,系统提示 “Operation not permitted” (操作不允许),这是为什么? 答: 这通常意味着你**没有足够的权限**来执行这个操作。原因可能有:1) 你尝试修改的文件或目录,其**所有者不是你**,并且你也不是 root 用户。普通用户只能修改自己拥有的文件的权限,不能修改别人的。2) 即使文件是你自己的,但你尝试执行的 chown 命令(改变所有者)通常**只有 root 用户才能执行**(因为这涉及到系统安全)。3) 你可能需要使用 sudo 命令来临时获取管理员权限执行,例如 sudo chmod ...sudo chown ...。4) 文件系统可能被以只读方式挂载了。5) (较少见) 文件可能设置了“不可变属性”(immutable bit),即使是 root 也不能直接修改,需要先用 chattr -i filename 清除该属性。
  3. 问: 在 chmod 的符号模式中,大写 X 和小写 x 有什么区别? 答: 这是一个非常实用但容易被忽略的区别!小写 x 会无条件地为指定对象(文件或目录)添加或移除执行权限。而大写 X 则更“智能”一些,它的行为是:
    • 如果作用对象是**目录**,则为其添加执行权限(因为目录总是需要执行权限才能进入)。
    • 如果作用对象是**文件**,则只有当该文件**已经至少对某类用户(所有者、组、或其他人中的任何一个)拥有执行权限**时,才会为其添加(或保持)执行权限。如果文件原本对任何用户都没有执行权限(比如它是个普通的文本文件),那么使用大写 X 就不会给它添加执行权限。
    这个特性在你使用 chmod -R a+X directory_name/ 这样递归地给整个目录树添加执行权限时非常有用,它能确保只给子目录和原本就是可执行的文件(如脚本)添加执行权限,而不会错误地给目录下的所有普通文本文件、图片等都加上无用的执行位。
  4. 问: 新创建的文件和目录的默认权限是怎么决定的?除了 umask 还有其他因素吗? 答: 新创建的文件和目录的默认权限,主要由两个因素决定:1) 程序创建文件/目录时指定的**初始权限模式**(比如一个程序可以用 open() 系统调用指定以 0666 模式创建文件)。2) 当前用户的 **umask 值**。最终的默认权限是**初始权限模式“与上”umask 值的“反码”**。例如,如果程序尝试以 0666 (rw-rw-rw-) 创建文件,而用户的 umask0022 (其反码是 0755 或二进制的 111101101),那么最终文件的权限就是 0666 & (~0022) = 0644 (rw-r--r--)。对于目录,程序通常以 0777 (rwxrwxrwx) 模式创建,经过 0022 的 umask 后就是 0755 (rwxr-xr-x)。所以,umask 起到的是“屏蔽掉”某些权限的作用。此外,如果文件系统支持 ACL (Access Control Lists),ACL 规则也可能覆盖或补充传统的 Unix 权限。
  5. 问: root 用户真的可以无视所有文件权限吗? 答: 在绝大多数情况下,是的。root 用户(UID 为 0)是 Linux 系统中的“上帝”,它通常可以读取、写入、执行系统上的任何文件,无论这些文件的权限位是如何设置的。它也可以更改任何文件的所有者和权限。这就是为什么我们反复强调“不要轻易使用 root 用户进行日常操作”的原因——一旦 root 用户被误用或被攻击者控制,整个系统的安全就荡然无存了。但是,也有极少数例外情况,比如:1) 文件系统以**只读方式挂载**时,即使是 root 也无法写入。2) 文件设置了**特殊的文件属性 (Attributes)**,比如“不可变位 (immutable bit)” (通过 chattr +i filename 设置),即使是 root 也无法修改或删除该文件,除非先用 chattr -i 清除该属性。3) 在某些强制访问控制 (MAC) 系统(如 SELinux, AppArmor)的严格策略下,即使是 root 用户的某些操作也可能受到限制。

实操指南

[服务器备份教程] Rclone实战:自动备份数据到阿里云OSS/腾讯云COS等对象存储

2025-5-19 10:53:50

实操指南

[Linux排查] "Permission Denied"?一文解决Linux文件/目录权限不足问题

2025-5-19 13:09:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧