通过示例解释 Linux 文件权限和所有权
Linux 文件权限用更简单的术语解释。还可以在这份详细的初学者指南中了解如何更改 Linux 中的文件权限和所有权。
从设计上来说,Linux 是一个多用户操作系统。在企业系统中,会有多个用户访问同一系统。但如果任何用户都可以访问和修改属于其他用户的所有文件或系统文件,这肯定会存在安全风险。
这就是 UNIX 以及 Linux(Linux 是类 Unix 系统)具有内置安全措施的原因。这确保了文件或目录只能由所需的用户访问、修改或执行。
在 Linux 中,哪个用户访问哪个文件由两个因素决定:
文件所有权
文件权限
了解文件所有权和权限对于 Linux 用户至关重要。我将在这里详细解释这些术语。
Linux 中的文件所有权
注意:我可能在这里使用术语“文件”,但它也适用于目录。我想你知道目录也是文件。
Linux 中的每个文件和目录都有三种所有者:
用户
用户是文件的所有者。当您创建文件时,您就成为该文件的所有者。所有权也可以更改,但我们稍后会看到。
团体
每个用户都是特定组的一部分。一个组由多个用户组成,这是在多用户环境中管理用户的一种方法。
例如,如果您有开发团队、QA 团队和系统管理员团队访问同一系统,您应该为他们创建单独的组。这样,您可以有效地管理文件和系统的安全性。它可以节省时间,因为您只需将用户添加到组并更改该组的权限即可,而无需手动为每个用户添加权限。您将在本文后面看到如何执行此操作。
即使您是系统的唯一用户,您仍然是许多组的一部分。像 Ubuntu 这样的发行版也会创建一个名称与用户名相同的组。
其他
“其他”可以被视为包含系统上所有用户的超级组。基本上,任何有权访问系统的人都属于这个组。
换句话说,“用户”是单个用户,组是用户的集合,其他由系统上的所有用户组成。
Linux 中的文件权限
Linux 中的每个文件和目录对于所有三种所有者都具有以下三种权限:
文件权限
读取 – 可以查看或复制文件内容
写 – 可以修改文件内容
执行 – 可以运行该文件(如果它是可执行文件)
目录权限
读取 – 可以列出所有文件并从目录复制文件
写入 – 可以在目录中添加或删除文件(也需要执行权限)
执行——可以进入目录
了解 Linux 中的文件权限和所有权
现在您已经了解了文件权限和所有权的基本术语,是时候看看它的实际应用了。
您可以使用“stat 命令”或“ls 命令”来检查文件权限。
如果您在文件上使用带选项 -l 的 ls 命令,您将看到如下输出:
-rwxrw-r-- 1 abhi linux 457 Aug 10 11:55 agatha.txt
让我用图片解释这个输出:
让我进一步详细解释整个输出:
文件类型:表示文件的类型。 d 表示目录,- 表示常规文件,l 表示符号链接。
权限:此字段显示文件上设置的权限。我将在下一节中详细解释。
硬链接计数:显示文件是否具有硬链接。默认计数为 1。
用户:拥有文件的用户。
组:有权访问此文件的组。一次只有一个组可以成为文件的所有者。
文件大小:文件大小(以字节为单位)。
修改时间:文件上次修改的日期和时间。
文件名:显然,文件或目录的名称。
现在您已经了解了 ls -l 命令的输出,让我们重点关注文件权限部分。
在上面的命令中,您会看到类似这样的九位数字格式的文件权限:
rwxrw-r--
每个字母表示一个特定的权限:
r :读取权限
w : 写权限
x : 执行权限
– : 未设置权限
权限始终按读、写、执行的顺序排列,即 rwx。然后按照用户、组和其他的顺序为所有三种所有者(请参阅所有权部分)设置这些权限。
这张图会更好地解释事情:
因此,如果您现在查看上图,您可以对文件权限进行以下说明:
用户所有者对该文件具有读、写和执行权限。但该文件的所有者是谁?您可以在 ls -l 的输出中找到此信息(即用户 abhi)。
该文件对该组具有读写权限,但不具有执行权限。是哪个组?您可以在命令 ls -l 的输出中找到组信息(即对其foss 进行分组)。
该文件仅对其他人(即有权访问系统的每个人)具有读取权限。您不需要知道它是哪一个,因为“其他”意味着所有用户。
现在,如果您再次看到整个 ls -l 命令,则可以一起读取文件权限和所有权。
-rwxrw-r-- 1 abhi linux 457 Aug 10 11:55 agatha.txt
文件 agatha.txt 归用户 abhi 所有,并且 abhi 具有读、写和执行权限。 istfoss 组的所有成员都具有对此文件的读写权限,而其他人对此文件仅有读取权限。
注意:root用户拥有超能力,通常情况下,它对所有文件都有读、写和执行的权限,即使你在文件权限中看不到它。
单个用户可以是多个组的成员,但只有该用户的主要组才是该用户创建的文件的组所有者。可以使用 id 命令找到用户的主要组,例如 id -gn
。如果您想查找自己的主要组,请将用户名留空。
现在您已经知道如何查找文件的权限,让我们看看如何更改文件的权限和所有权。
更改 Linux 中的文件权限
您可以使用 chmod 命令来更改 Linux 中文件的权限。
有两种方法使用 chmod 命令:
绝对模式
符号模式
在绝对模式下使用 chmod
在绝对模式下,权限以数字形式(准确地说是八进制)表示。在这个系统中,每个文件的权限都用一个数字来表示。
r(读)= 4
w(写入)= 2
x(执行)= 1
–(无许可)= 0
通过这些数值,您可以将它们组合起来,从而可以使用一个数字来表示整个权限集。
- 0
—
- 1
-X
- 2
-w-
- 3 (i.e. 2+1)
-wx
- 4
r–
- 5 (i.e. 4+1)
r-x
- 6 (i.e. 4+2)
RW-
- 7 (i.e. 4+2+1)
读写
到目前为止,您能猜出示例中 agatha.txt 文件的文件权限数字吗?没错,就是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 命令。
在我们之前的例子中,如果你想为组所有者添加执行权限,你可以使用 chmod 命令,如下所示:
chmod g+x agatha.txt
如果您现在查看此文件的权限,您将看到现在已添加执行权限:
-rw-rwxrw- 1 abhi linux 457 Aug 10 11:55 agatha.txt
您还可以将多个权限更改合并到一个命令中。假设您要删除“其他”的读写权限并添加执行权限。您还想为用户所有者添加执行权限。您只需一个命令即可完成所有操作:
chmod o-rw+x,u+x agatha.txt
最终的权限将是这样的:
-rwxrwx--x 1 abhi linux 457 Aug 10 11:55 agatha.txt
如果想同时更改这三类用户的权限,可以通过以下方式使用:
chmod a-x agatha.txt
这将删除每个人的执行权限。
-rw-rw---- 1 abhi linux 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>
在我们目前的示例中,如果要将用户所有者和组更改为 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 linux 457 Aug 10 11:55 agatha.txt
现在,如果用户 abhi 尝试使用 cat 或 less 命令读取文件,他能够吗?答案是否定的,因为它没有读取权限。
但用户 abhi 是 linux 组的一部分,并且该组具有读取权限。哎呀!其他有读写权限。这应该意味着每个人(包括用户 abhi)都可以读取和写入该文件,对吗?错误的!
在 Linux 中,优先级先是用户,然后是组,最后是其他。 Linux 系统检查谁启动了该进程(在我们的示例中为 cat 或 less)。如果启动该进程的用户也是该文件的用户所有者,则设置用户权限位。
如果文件的所有者没有启动该进程,那么 Linux 系统会检查该组。如果启动该进程的用户与文件的所有者组位于同一组中,则设置组权限位。
如果该进程所有者甚至不在文件组所有者的组中,则设置其他权限位。
接下来是什么?
我希望您喜欢这篇文章,现在您可以更好地了解 Linux 中文件权限的工作原理。
如果您愿意,接下来您可以学习一些高级文件权限,例如 SUID、GUID 和粘性位。
如果您有任何问题或建议,或者只是想表达感谢,请在下面发表评论。如果您喜欢这篇文章,请在社交媒体或各种论坛上分享。这也将帮助我们和其他 Linux 用户。