在Linux上做了10年开发,Linux系统的文件权限竟然还没完全弄清楚 !

一、你将学到什么

如果您阅读完本文,您将学到以下所有内容:

  • Linux系统上的权限掩码是什么以及它有什么用途;
  • 如何管理文件和目录的访问权限;
  • 什么是suid、sgid和sticky bit;

Linux权限基础

在开始之前,您需要先了解一些基本的概念,然后再了解更复杂的细节。在Linux系统上,权限基本上分为两类:

  • 所有权:拥有该文件的用户和组,这意味着他们创建了该文件或者被指定为该文件或目录的所有者。
  • 权限:给定一个文件或目录,权限表示您能够执行的一组操作,具体取决于您是谁(您登录的用户帐户)以及您所属的组。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    您在哪里可以看到这些信息呢?

Linux 下查看文件权限的最常用方法是使用带有“al ”选项的“ls”命令。

$ ls -al

以下是如何理解 ls 命令的输出。

本文仅关注第一第三第四列,因为其他列与权限不太相关。

了解 Linux 文件类型

您可能以前听说过,Linux 中一切皆文件,因此,链接是文件,目录也是文件。当您观察 ls 输出的第一列时,您应该注意第一位。Linux 文件可以有多种类型,但大多数时候它们要么是文件(-)目录(d)链接(l)

从上面 ls 的输出中可以知道系统有一个名为**.bash_history的文件,一个名为.bashrc 的文件和三个名为.cache、.config 和 Desktop 的目录**。

了解文件所有者和所属组

如果您再看一下 ls 命令的输出,您会看到“devconnected”出现在两个单独的列中。

第三列称为“用户”列,用于显示谁实际拥有该文件。在这种情况下,由于我在我的主目录中,所以我是该文件的实际所有者。

第四列称为“文件所属组”。在 Linux 中,用户可以属于一个或多个组(Group),例如管理员组、sudo 组或普通用户组。在这种情况下,文件不仅有一个所有者,还属于一个特定的组。

了解 Linux 文件权限

文件权限

现在您对不同的文件类型有了更好的了解,是时候关注第一列的其余部分了:**权限。

权限分为三类:用户权限,组权限和“其他”权限。在每个类别中,您可以看到一个字母或一个破折号。字母可以是表示读取权限的****r、表示写入权限的****w和表示“执行”权限的x。破折号只是意味着您没有权限。让我们看一下之前 ls 输出的第一行。

第一个破折号表示 .bash_history 是一个普通文件。

然后对于用户,您设置了以下权限:“rw -”,这意味着“devconnected”用户可以读取和写入该文件但不能执行它。对于组,您设置了以下权限:“- – -”,这意味着“devconnected”组不能读取、写入或执行该文件。最后,对于“其他人”,拥有与 devconnected 组相同的权利,这意味着他们根本不能做任何事情。

轮到你了:下面这个文件的权限是什么?
在这里插入图片描述

答案:文件所有者可以读取、写入,但不能执行。文件所属组可以读取,但不能写入或执行。同样,“其他人”可以读取,但不能写入或执行。

下面是文件的读、写和执行权限含义的表格。

目录权限

但是,正如您可能看到的那样,读取写入执行也适用于目录。那么对于目录,可执行、写入、读取意味着什么?下面是目录的读、写和执行权限含义的表。

什么是Linux权限掩码?

在 Linux 中,新创建文件或者目录都有一个 默认权限。

  • 文件:新建文件默认的权限是 666(即 rw-rw-rw-),表示所有者、组和其他用户都可以读取和写入文件,但不能执行。
  • 目录:新建目录的默认权限是 777(即 rwxrwxrwx),表示所有者、组和其他用户都可以读取、写入和执行目录。

在 Linux 中,“权限掩码”(umask)是一个控制新建文件/目录的默认权限的机制。它通过设置一个“掩码”来限制文件和目录的初始权限。

权限掩码(umask)是一个由三个数字组成的值,用来决定新创建的文件或目录的默认权限会有哪些被“掩盖”或移除。

Linux 系统上,可以通过运行umask命令来获取权限掩码。

现在,暂时关注掩码的最后三位数字:“022”(后面会讨论第一个零)。表示希望删除“组”和“其他用户”的写权限,因此在该系统中:

  • 创建文件,默认权限是 666,减去掩码 022 后,最终权限是 644(即 rw-r–r–),表示只有文件所有者可以读写,组和其他用户只能读取。
  • 创建目录:默认权限是 777,减去掩码 022 后,最终权限是 755(即 rwxr-xr-x),表示只有目录所有者可以读、写和执行,组和其他用户只能读取和执行。

为了证明这一点,我们创建一个文件。

$ touch test
$ ls -l test

可以看到,创建的文件其最终权限确实为”rw-r–r–”。

类似地,让我们在系统上创建一个目录。

$ mkdir test-directory
$ ls -l | grep test-directory

很好!现在我们已经了解了Linux 权限掩码,接下来让我们看看如何在 Linux 系统上管理文件的权限。

如何管理Linux系统上文件的权限?

在 Linux 系统中,管理文件和目录的权限及所有者、所属组是很重要的。chmod、chown 和 chgrp 是我们常用的命令。

a – chmod

chmod 命令用于更改文件或目录的权限,chmod 命令有两种形式:

1. 使用数字模式修改权限

数字模式使用八进制数来表示权限:

  • r(读权限) = 4
  • w(写权限) = 2
  • x(执行权限) = 1

通过将这些值相加,可以组合出所需的权限。例如:

chmod 755 filename

755 代表所有者有 rwx(7),组有 rx(5),其他用户有 rx(5)的权限。最终文件权限设置为 rwxr-xr-x。

2. 使用字母模式修改权限

字母模式使用符号来表示和修改权限:

  • u: 所有者(user)
  • g: 组(group)
  • o: 其他用户(others)
  • a: 所有人(all)

使用 + 添加权限,- 删除权限,= 直接设置权限。

例如:

chmod u+rwx, g+rx, o+rx filename

示例中,u+rwx 表示给文件所有者添加读、写、执行权限,g+rx 给文件所属组添加读、执行权限,o+rx 给其他用户添加读、执行权限。最终文件权限设置为 rwxr-xr-x。

b – chown

chown 命令用于更改文件或目录的所有者,如果需要还可以同时更改文件的所属组。

#将 report.txt 的所有者改为 john,
chown john report.txt

#将文件 filename 的所有者变为 alice,所属组变为 staff。
chown alice:staff filename

太棒了!现在我们对 chown和 chmod命令有了一些了解。最后,让我们深入了解 chgrp 命令。

c – chgrp

chgrp 命令用于更改文件或目录的所属组。文件所属的组决定了哪些用户(属于该组的用户)可以访问或修改该文件。

例如:

chgrp developers project.docx

示例中,将文件 project.docx 的所属组改为 developers

suid、guid 和 sticky bit 是什么?

suid、guid 和 sticky bit 是 Linux 权限中一些更高级的概念,它们在不同的场景下非常有用。

a – 了解 suid

suid 是一种特殊权限,应用于可执行文件。当一个文件设置了 suid 权限后,无论谁执行这个文件,都会临时以文件所有者的身份来执行,而不是以当前用户的身份。

可以使用以下命令将指定文件设置suid权限。

#u+s 为 su 文件的所有者设置 SUID 位。
$ chmod u+s /usr/bin/su

我们再来查看下这个文件的权限。

$ ls -l /usr/bin/su

您可能已经注意到,suid权限与通常的“rwx”三元组略有不同。执行权限不再使用x或破折号表示,而是用字母 s 代替。这意味着为该文件设置了 suid。

b – 为什么 suid 很重要?

为了说明为什么 suid 如此重要,我们以passwd命令为例。在 Linux 系统上,passwd 命令用于设置用户的密码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
当设置密码时,系统上的shadow文件会被修改。shadow文件(位于 /etc/shadow)是一个非常受限制的文件,其中包含有关机器上所有用户的信息及其加密密码。

查看shadow文件的权限。
在这里插入图片描述
只有 root 帐户可以写入此文件。但是,如果我运行一个简单的 passwd 命令(以非 sudo 用户身份),该命令将使用我的凭据执行(在本例中为 devconnected)。

我可以往shadow文件写入数据吗?不能。这就是发明 suid 的原因。如果我运行 passwd 命令,该命令将以 passwd 文件的所有者身份执行,在本例中为“root”。由于 root 有权写入此文件,因此更改将在影子文件中生效。

c – 理解guid

。默认情况下,用户创建文件(夹)时,文件所属组为此用户所属的组。一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,而不是创建文件的用户组

设你有一个共享目录 test,所有组成员都可以在这个目录中创建文件。为了确保不同组成员新创建的文件都属于同一个组,你可以设置guid 。

chmod g+s test

拥有suid权限时,所有者的执行权限表现为s,而拥有guid权限的情况下则是组权限中表达执行权限的x变为s。

e – 理解sticky bit

如果用户对目录具有写入和执行权限,他将能够向其中创建文件,也可以从中删除文件。

现在假设有两个用户在同一个 Linux 机器上工作。这两个用户可能使用相同的文件夹(例如,在共享目录的情况下)。例如 tmp 目录。您可能希望将文件存储在 tmp 目录中,但又不希望其他用户能够删除您的文件。

这正是sticky bit的使用的场景:我希望能够将文件添加到目录中,以及修改其内容,但我不希望其他用户移动或删除我的文件(即使他们自己有添加文件的权限)。

也就是说,当一个目录设置了 Sticky Bit 后,只有文件的所有者或管理员可以删除或移动该目录中的文件。

设置接移除目录的Sticky Bit权限的命令如下:

# 为 test 目录设置 Sticky Bit。
$ chmod +t test

#移除test 目录的 Sticky Bit。
$ chmod -t test

当目录具有 Sticky Bit 时,在权限行上,粘滞位将在其末尾用小写t表示。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://i-blog.csdnimg.cn/direct/bfedfe7ee4024f4eaaa29759db9d50ca.png

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值