用示例解释 Linux 文件权限和所有权

按照设计,Linux 是一个多用户操作系统。 在企业系统中,会有多个用户访问同一个系统。 但是如果任何用户都可以访问和修改属于其他用户的所有文件或系统文件,这肯定会带来安全风险。

这就是 UNIX 和 Linux(Linux 是一个类 Unix 系统)内置安全措施的原因。 这确保了文件或目录只能由所需的用户访问、修改或执行。

Linux 中的两个因素决定了哪个用户可以访问哪个文件:

  • 文件所有权
  • 文件权限

了解文件所有权和权限对于 Linux 用户至关重要。 我将在这里详细解释这些术语。

Linux 中的文件所有权

注意:我可能在这里使用术语文件,但它也适用于目录。 我猜你知道目录无论如何都是文件。

Linux 中的每个文件和目录都有三种所有者:

用户

用户是文件的所有者。 创建文件时,您将成为文件的所有者。 所有权也可以更改,但我们稍后会看到。

团体

每个用户都是特定组的一部分。 一个组由多个用户组成,这是在多用户环境中管理用户的一种方式。

为了 example,如果您有 dev 团队、QA 团队和 sysadmin 团队访问同一个系统,您应该为他们创建单独的组。 这样,您可以有效地管理文件和系统的安全性。 它节省了时间,因为您可以简单地将他们添加到组并更改组的权限,而不是手动为每个用户添加权限。 您将在本文后面看到如何做到这一点。

即使您是系统的唯一用户,您仍然会成为许多组的一部分。 像 Ubuntu 这样的发行版也会创建一个名称与用户名相同的组。

?运行命令 团体 查看您属于哪些用户组。

其他

‘Other’ 可以被认为是系统上所有用户的超级组。 基本上,任何有权访问该系统的人都属于该组。

换句话说,’User’ 是单个用户,Group 是用户的集合,Other 由系统上的所有用户组成。

Linux 中的文件权限

Linux 中的每个文件和目录对所有三种所有者都具有以下三种权限:

文件的权限

  • 读取 – 可以查看或复制文件内容
  • 写入 – 可以修改文件内容
  • 执行 – 可以运行文件(如果它的可执行文件)

目录权限

  • 读取 – 可以列出所有文件并从目录中复制文件
  • 写入 – 可以在目录中添加或删除文件(也需要执行权限)
  • 执行——可以进入目录

了解 Linux 中的文件权限和所有权

现在您已经了解了文件权限和所有权的基本术语,是时候看看它的实际应用了。

您可以使用“stat 命令”或“ls 命令”来检查文件权限。

如果您在文件上使用带有选项 -l 的 ls 命令,您将看到如下输出:

-rwxrw-r-- 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

让我用一张图片来解释这个输出:

让我进一步详细解释整个输出:

  • 文件类型: 表示文件的类型。 d 表示目录,- 表示常规文件,l 表示符号链接。
  • 权限:此字段显示文件的权限集。 我将在下一节中详细解释。
  • 硬链接数:显示文件是否有硬链接。 默认计数为 1。
  • 用户: 拥有文件的用户。
  • 团体:有权访问此文件的组。 一次只能有一个组是文件的所有者。
  • 文件大小:文件的大小(以字节为单位)。
  • 修改时间:上次修改文件的日期和时间。
  • 文件名: 很明显,文件或目录的名称。

现在您已经了解了 ls -l 命令输出,让我们关注文件权限部分。

在上面的命令中,您在九位数字中看到了这样的文件权限 格式

rwxrw-r--

每个字母表示一个特定的权限:

  • r : 读取权限
  • w : 写权限
  • x : 执行权限
  • – : 没有权限集

权限总是按照读、写、执行的顺序,即rwx。 然后按照用户、组和其他的顺序为所有三种所有者(参见所有权部分)设置这些权限。

这张图片会更好地解释事情:

所以,如果你现在看上图,你可以说以下关于文件权限的事情:

  • 该文件具有用户所有者的读取、写入和执行权限。 但是这个文件的使用所有者是谁? 您在 ls -l(即用户 abhi)的输出中有此信息。
  • 该文件具有 Group 的读写权限,但没有执行权限。 是哪一组? 您在命令 ls -l 的输出中有组信息(即 group itsfoss)。
  • 该文件只有其他人的读取权限,即有权访问系统的每个人。 您不需要知道它是哪一个,因为“其他”是指所有用户。

现在,如果您再次看到整个 ls -l 命令,您可以一起读取文件权限和所有权。

-rwxrw-r-- 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

文件 agatha.txt 归用户 abhi 所有,abhi 具有读、写和执行权限。 组 istfoss 的所有成员都对该文件具有读取和写入权限,而其他所有人仅对该文件具有读取权限。

注意:root 用户拥有超能力,通常对所有文件都有读、写和执行权限,即使您在文件权限中看不到它。

单个用户可能是多个组的成员,但只有用户的主组是用户创建的文件的组所有者。 可以使用 id 命令找到用户的主要组,例如 id -gn <username>. 如果您尝试查找自己的主要组,请将用户名留空。

既然您知道如何找出文件的权限,让我们看看如何更改文件的权限和所有权。

在 Linux 中更改文件权限

您可以使用 修改 用于在 Linux 中更改文件权限的命令。

?权限曾经被称为访问模式,因此 chmod 是更改访问模式的简写形式。

使用 chmod 命令有两种方法:

  • 绝对模式
  • 符号模式

在绝对模式下使用 chmod

在绝对模式下,权限以数字形式表示(准确地说是八进制)。 在这个系统中,每个文件权限都由一个数字表示。

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

使用这些数值,您可以将它们组合起来,因此可以使用一个数字来表示整个权限集。

数字允许
0
1-X
2-w-
3(即2+1)-wx
4r–
5(即4+1)接收
6(即4+2)rw-
7(即4+2+1)rwx

你能猜出我们在 agatha.txt 文件中的数字文件权限吗 example 至今? 没错,就是764。

现在您知道了哪个数字代表哪个权限,让我们看看如何使用这些知识更改文件权限。

假设你想改变 agatha.txt 的文件权限,让每个人都可以读写,但没有人可以执行? 在这种情况下,您可以像这样使用 chmod 命令:

chmod 666 agatha.txt

如果您现在列出 agatha.txt,您会看到权限已更改。

-rw-rw-rw- 1 abhishek abhishek 457 Aug 10 11:55 agatha.txt

在符号模式下使用 chmod

绝对模式的问题在于,即使您只想更改一个所有者的权限集,您也应该始终为所有三个所有者提供三个数字。

这是您可以使用 chmod 命令的符号模式的地方。

在符号模式下,所有者用以下符号表示:

  • u = 用户所有者
  • g = 组所有者
  • o = 其他
  • a = 全部(用户 + 组 + 其他)

符号模式使用数学运算符来执行权限更改:

  • + 用于添加权限
  • – 用于删除权限
  • = 用新值覆盖现有权限

现在您知道了,让我们看看如何在符号模式下使用 chmod 命令。

在我们之前的 example,如果要为组所有者添加执行权限,可以使用 chmod 命令,如下所示:

chmod g+x agatha.txt

如果你现在查看这个文件的权限,你会看到现在已经添加了执行权限:

-rw-rwxrw- 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

您还可以在一个命令中组合多个权限更改。 假设您要删除读写权限并为其他添加执行权限。 您还想为用户所有者添加执行权限。 您可以通过一个命令完成所有操作:

chmod o-rw+x,u+x agatha.txt

生成的权限将如下所示:

-rwxrwx--x 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

如果要同时更改所有三种用户的权限,可以通过以下方式使用:

chmod a-x agatha.txt

这将删除每个人的执行权限。

-rw-rw---- 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

有些人发现将文件权限从一种模式转换为另一种模式是一项令人厌烦的工作。 这就是为什么我创建了这个小工具,它允许您在线计算各种模式的 Linux 文件权限。

在 Linux 中更改文件所有权

要更改文件的所有权,您可以使用 命令 chown. 您可能很容易猜到 chown 代表变更所有者。

您可以通过以下方式更改文件的用户所有者:

chown <new_user_name> <filename>

如果要更改用户和组,可以使用 chown 命令,如下所示:

chown <new_user_name>:<new_user_group> <filename>

如果您只想更改组,可以通过以下方式使用 chown 命令:

chown :<new_user_group> <filename>

或使用专门用于更改文件或目录的组所有者的 chgrp 命令。 你可以猜到 chgrp 代表变更组。

chgrp <new_user_group> <filename>

在我们的 example 到目前为止,如果要将用户所有者和组更改为 root,可以使用 chown 命令,如下所示:

sudo chown root:root agatha.txt

这会将文件的所有权更改为用户和组的 root。

-rw-rw---- 1 root root 457 Aug 10 11:55 agatha.txt

请注意,我必须使用 sudo 与 chown? 这是因为这里涉及到root,并且要处理root,您需要超级用户权限。

提示: 两个组不能拥有同一个文件。

额外提示:文件权限是否有优先级?

考虑一种情况,用户所有者没有任何权限,组具有读取权限,而其他人具有读取和写入权限。

----r--rw- 1 abhi itsfoss 457 Aug 10 11:55 agatha.txt

现在,如果用户 abhi 尝试使用 cat 或 less 命令读取文件,他能做到吗? 答案是否定的,因为它没有读取权限。

但是用户 abhi 是 itsfoss 组的一部分,并且该组具有读取权限。 见鬼! 其他有读写权限。 这应该意味着每个人(包括用户 abhi)都可以读写文件,对吧? 错误的!

在 Linux 中,优先级从用户开始,然后是组,然后是其他。 Linux 系统检查谁启动了进程(在我们的 example)。 如果启动进程的用户也是文件的用户所有者,则设置用户权限位。

如果文件的所有者没有启动该过程,则 Linux 系统会检查该组。 如果启动进程的用户与文件的所有者组在同一组中,则设置组权限位。

如果此进程所有者甚至不在组中作为文件的组所有者,则设置其他权限位。

接下来是什么?

我希望您喜欢这篇文章,现在您对 Linux 中文件权限的工作方式有了更好的理解。

如果您愿意,接下来可以学习一些高级文件权限,例如 SUID、GUID 和粘性位。

如果您有任何问题或建议,或者只想说声谢谢,请在下面发表评论。 如果您喜欢这篇文章,请在社交媒体或各种论坛上分享。 这也将帮助我们和其他 Linux 用户。