Linux中的Chattr命令(设置不可变位)
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/