Linux中的Chattr命令(设置不可变位)

时间:2020-03-05 15:26:03  来源:igfitidea点击:

Chattr(更改属性)是用于更改文件属性的命令行Linux实用程序。
它可以为Linux系统中的文件设置和取消设置某些属性,以确保意外删除或者修改重要文件和文件夹,即使我们以root用户身份登录也是如此。

因此,使用chattr命令可以使文件不可变。
换句话说,这意味着它用于停止意外删除文件和目录。
即使我们对文件具有完全权限,也无法删除通过chattr属性保护的文件。

这对于包含所有用户信息和密码的系统文件(例如shadow和passwd文件)非常有用。
这些属性只能在ext2,ext3或者ext4文件系统中的文件和目录上设置。

chattr命令的语法和用法

下面是chattr命令的语法:

chattr [ -RVf ] [ -v version ] [ mode ] files...

我们可以使用chattr命令使用的文件属性:

  • a-该文件只能以追加模式打开以进行写入。
  • A-文件的实时记录未修改。这样可以避免笔记本电脑系统使用一定数量的磁盘I/O。
  • c-内核自动将文件压缩到磁盘上。对该文件的读取将返回未压缩的数据。对该文件的写操作会先压缩数据,然后再将其存储在磁盘上。
  • C-该文件将不受写时复制更新的约束。仅在执行写时复制的文件系统上支持此标志。如果在目录上设置了“ C”标志,则对目录不起作用
  • d-运行转储程序时文件不适合备份。
  • D-修改目录后,更改将同步写入磁盘;这等效于应用于文件子集的“ dirsync”安装选项。
  • i-无法修改,删除或者重命名文件,无法创建与此文件的链接,也不能将任何数据写入该文件。只有超级用户可以设置或者清除此属性。
  • j-在将文件的所有数据写入文件本身之前,将其所有数据写入ext3或者ext4日志,
  • s-如果文件被删除,其块将被清零并写回到磁盘。
  • S-如果文件被修改,则更改被同步写入磁盘;这等效于应用于文件子集的'sync'挂载选项。
  • t-与其他文件合并的文件末尾文件不会有部分块片段
  • T-就Orlov块分配器而言,该目录将被视为目录层次结构的顶部。
  • u-表示如果删除文件,则保存其内容。这允许用户要求其取消删除

1)如何设置文件属性(设置不可变位)

要设置文件属性,我们将使用带有+运算符的chattr命令,后跟属性名称。

让我们用示例检查如何将不可变属性设置为文件。
只有root用户或者具有sudo特权的用户才能设置和删除文件上的不可变标志。

具有不可变属性的文件:

  • 无法修改,删除,重命名
  • 包括root用户在内的任何人都不能创建软链接或者硬链接。
  • 无法将任何数据写入文件

让我们使用touch命令创建一个空文件,如下所示:

$touch file1

现在让我们看看如何使用lsattr命令列出文件的属性:

$lsattr 
-------------e-- ./nagios-cookbook-tutorial
-------------e-- ./chefdk_1.3.40-1_amd64.deb
-------------e-- ./file1

使用echo命令将一些内容添加到文件中:

$echo "Test of i attribute" > file1 
$cat file1 
Test of i attribute

现在我们可以在文件(file1)上使用“ + i”设置不可变属性。

$sudo chattr +i file1
$lsattr 
-------------e-- ./nagios-cookbook-tutorial
-------------e-- ./chefdk_1.3.40-1_amd64.deb
----i--------e-- ./file1

在以下命令中,我们将尝试追加,使用普通用户和sudo用户(root)删除它们:

$echo "Try to edit after set i attribute" >> file1 
-bash: file1: Permission denied
$sudo echo "Try to edit after set i attribute" >> file1 
-bash: file1: Permission denied
$rm -f file1 
rm: cannot remove 'file1': Operation not permitted
$sudo rm -f file1 
rm: cannot remove 'file1': Operation not permitted

我们可以看到,最重要的是不允许进行任何操作。

注意:我们可以将重要文件保护为/etc/passwd或者/etc/shadow,使其免受意外删除或者篡改的影响,并且还会禁用用户帐户的创建。
但是,当我们尝试创建新的系统用户时,会收到一条错误消息,提示“无法打开/etc/passwd”。
如果尝试更改密码,将提示我们输入新密码,但是下次登录时,新密码似乎无效,我们必须使用旧密码登录。

2)如何删除文件上的属性(未设置)

要从文件中删除任何属性,我们必须使用-运算符,后跟属性名称。

在下面的示例中,让我们从文件(file1)中取消设置不可变属性。

$sudo chattr -i file1
$lsattr file1
-------------e-- ./file1

现在,我们应该可以对文件执行所有常规操作了。

3)如何使用“ i”属性保护目录

为了保护目录,我们必须使用+运算符来递归设置(-R)属性。

以下命令将递归设置目录('theitroad')上的不可变位:

$sudo chattr -R +i theitroad/
$lsattr -d theitroad
----i--------e-- theitroad/

要取消设置,请使用-运算符,然后使用i属性。

$sudo chattr -R -i theitroad/

4)将数据追加到文件中而不更改现有数据

可以允许每个人仅将数据追加到文件上,而无需使用a属性更改或者修改已输入的数据。

这意味着我们只能在当前文件上添加内容,而不能修改已经存在的数据。

以下示例集将属性添加到文件(file2)。

$sudo chattr +a file2

6)如何列出文件属性

要列出文件或者目录的当前属性,我们必须使用lsattr命令。
以下命令将列出当前目录中所有文件和文件夹的文件属性:

$lsattr 
-------------e-- ./coreutils-8.22-18.el7.x86_64.rpm
-------------e-- ./pac
-------------e-- ./utils
-------------e-- ./linox

我们可以使用以下命令检查单个文件的属性:

$lsattr coreutils-8.22-18.el7.x86_64.rpm 
-------------e-- coreutils-8.22-18.el7.x86_64.rpm

要检查目录的属性,请使用-d选项

$lsattr -d test
-------------e-- test/