如何在 Linux 上列出和管理文件属性
使用 Linux 时,我们有多种方法来管理对资源的访问:最基本的一种是对文件和目录设置适当的 UGO/RWX 权限。在某些情况下,我们可能还想使用 setuid、setgid 和粘性位。此外,我们可以使用 ACL(访问控制列表)来实现更高级别的粒度或实现强制访问控制安全性,例如基于 SELinux 或 AppArmor 的安全性。
除了上面提到的策略之外,在大多数文件系统上,我们还可以操作一组“属性”,例如使文件不可变。
在本文中,我们讨论 Linux 上的文件属性,并学习如何检查分配给文件的属性以及如何管理它们。
在本教程中您将学习:
文件属性可用于哪些用途
如何列出文件属性
如何分配/删除文件属性
介绍
Linux (DAC) 和其他基于 Unix 的操作系统上的自主访问控制,其基本形式是通过对文件应用一组特定的权限,并将其所有权设置为特定的用户和组来实现:这就是我们所要实现的。调用UGO/RWX权限。在之前的教程中,我们还讨论了一组在某些情况下有用的“特殊”标志或位:setuid、setgid 和粘性位,并且我们学习了如何通过使用 ACL 来分配更高粒度的权限(访问控制列表)。
我们还讨论了 SELinux,它可能是 Linux 上主要的强制访问控制实现。在本教程中,我们将了解如何根据我们使用的文件系统,使用一系列属性来启用/禁用文件和目录的特定功能。
列出文件属性
为了列出 Linux 上的文件属性,我们可以使用 lsattr 实用程序,该实用程序包含在最常用的 Linux 发行版上的 e2fsprogs 包中(尽管名称如此,但它可以也可用于 ext2/3/4 以外的文件系统,例如 xfs)。
该实用程序接受一个或多个文件作为参数,并支持一系列选项来修改其行为。让我们看一个它的用法示例。当不带任何参数或选项调用 lsattr
时,它会返回与工作目录中包含的文件和目录关联的属性列表,就像 ls
命令一样:
$ lsattr
--------------e------- ./Templates
--------------e------- ./Downloads
--------------e------- ./Projects
--------------e------- ./Documents
--------------e------- ./Desktop
--------------e------- ./Music
--------------e------- ./Public
--------------e------- ./Videos
--------------e------- ./Pictures
在上面的示例中,您可以看到我在主目录中调用了该命令。从命令的输出中,我们可以看到可见目录只分配了e
属性:这意味着它们正在使用“extents”来映射磁盘上的块(这与ext4文件系统的方式有关)作品)。如您所见,默认情况下,隐藏文件不包含在输出中;要包含它们,我们可以将 -a
选项传递给命令。我们还可以使用 -R
选项递归列出目录的属性,或者使用 - 列出目录的属性而不是其内容的属性。 d。
另一个有用的选项是 -l
,它用于显示与文件关联的属性的全名,而不是标识它们的单个字母:
$ lsattr -l
./Templates Extents
./Downloads Extents
./Projects Extents
./Documents Extents
./Desktop Extents
./Music Extents
./Public Extents
./Videos Extents
./Pictures Extents
各种属性的含义可以在 chattr
实用程序手册中检索,正如我们稍后将看到的,它用于设置或删除属性。这里我们只报告其中的一些(某些属性只能在某些文件系统上设置 - “j”,例如不能在没有日志记录的 ext2 文件系统上设置):
设置和删除属性
我们用来分配属性的实用程序是chattr;它的语法非常简单:要将属性分配给文件,我们使用 +
符号,后跟属性字母,然后将属性应分配到的文件的路径作为参数传递到命令。让我们看一个例子。
假设我们有一个文件(假设它名为 example.txt
),并且我们想为其分配 a
属性,以避免其内容被覆盖。这是我们要运行的命令:
$ sudo chattr +a example.txt
您可能会注意到,我们在命令前加上了 sudo 前缀,因为大多数属性只能由 root 用户分配或删除。我们可以使用 lsattr 来验证该属性是否已分配给文件:
$ lsattr -l example.txt
example.it Append_Only, Extents
现在,如果我们尝试使用 >
shell 重定向运算符进行写入以覆盖该文件,我们会收到错误:
$ echo "line" > example.txt
bash: example.txt: Operation not permitted
如果我们改用 >>
重定向运算符,将内容附加到文件中,则不会生成错误:
$ echo "line" >> example.txt
这是另一个例子。 i 属性可用于使文件不可变并且无法删除或移动,即使是 root 用户(但是可以完全删除该属性):
$ sudo chattr +i example.txt
$ sudo rm example.txt
rm: cannot remove 'example.txt': Operation not permitted
删除属性
要从文件中删除一个或多个属性,我们所要做的就是更改 chattr
使用的“运算符”。我们使用 -
代替 +
。要从“example.txt”文件中删除我们在上一个示例中设置的 i
和 a
属性,我们将运行:
$ sudo chattr -ai example.txt
在某些情况下,我们想要应用“反向”逻辑,基本上是说:“删除指定属性之外的所有属性”:为了应用此策略,我们可以使用 =
运算符。
结论
在本教程中,我们学习了如何使用“lsattr”和“chattr”实用程序在 Linux 上列出和管理文件属性,并且我们看到了一些属性的含义,如“i”(不可变)或“a”(仅附加) 。某些文件系统仅接受一组特定的属性:请查阅相应的手册以检查支持的属性。要了解有关属性的更多信息,通常您可以查看上述实用程序的文档。