使用 chattr 指令设置文件属性,可以在 Linux 中预防文件被更改或删除

Linux 中使用chattr 指令设置文件属性预防文件被更改或删除

在 Linux 中有一个 chattr 指令,它可以用来设置文件的各种属性,防止文件被删除或是更改,即使是有管理者权限的时候也无法改动。

在 Linux 系统中有时候我们会需要保护某些重要的文件,避免这些文件不小心被更改或是删除,像是 /etc 下面的一些系统设置文件,我们可能会不希望系统的套件管理程序在升级套件时更改掉我们已经设置好的设置档,当然您也可以使用 chown 与 chmod 将重要的文件改成 root 管理者才能够写入,不过这也很难预防您在使用 root 权限的时候误删文件的问题。

chattr 是一个可以用来设置 Linux 文件属性的指令,这些属性跟一般使用 chmod 所设置的读取(read)、写入(write)与执行(execute)不同,chattr 可以设置更多其他的属性,这些属性原本只有在 EXT 系列的文件系统(EXT2/3/4)有支援,而现在大部份 Linux 下面的文件系统都有支援了,如 XFS、Btrfs 与 ReiserFS 等。

chattr 指令是用来设置文件属性用的,而 lsattr 指令则可用来查看文件的属性,这两个指令是包含在 e2fsprogs 套件之中,一般的 Linux 发行版通常都会预先安装好。以下是使用教学与一些常用的范例。

基本使用方式

  chattr 指令的使用方式为:

chattr [-RVf] [operator][attribute(s)] files…其中 operator 可以是 、- 或 =,后面再加上要设置的 attribute(s),这跟 chmod 指令的用法类似,以下是一些常用的属性:

选项

-R 递归地作用于所有子目录及文件(默认不递归)。
-V 将chattr命令的输出变得详细些,并且会打印出chattr命令的版本。
-f 不打印错误信息。
-v version 给文件设置一个版本号。

 

  •   a:只能以附加的方式写入(append only)。
  •   c:自动压缩(compressed),Linux 核心会自动把文件的内容先压缩后,再写入硬碟,而在读取但内容时,Linux 核心也会自动进行解压缩。
  •   d:在使用 dump 时,这种文件会被排除(no dump)。
  •   i:文件不可以被改动(immutable),不可以写入、删除、建立链结档等。
  •   s:安全删除文件(secure deletion),当文件被删除时,系统会将所有硬碟上的文件内容用 0 取代,确保文件数据确实删除。
  •   A:不要升级文件存取时间(no atime updates)。
  •   C:关闭 copy-on-write(no copy on write)。
  •   S:当文件内容改动时,马上同步写入硬碟(synchronous updates)。

chattr 还有许多比较不常用的属性这里没有列出来,有兴趣的人可以查阅 chattr 的在线手册。

接着示范如何查看一个文件的属性,首先建立一个测试用的文件:

date > date.txt

接着使用 lsattr 来查看这个文件的属性:

lsattr date.txt

输出会像这样:

  ————-e– date.txt

这里的输出跟 ls -l 的输出类似,如果是 – 则代表该属性没有被设置,如果有被设置的话,就会出现对应的英文字母。

让文件不可以被改动

  系统中一些重要的文件可以设置 i 属性(immutable),防止文件被删除会是更改:

sudo chattr i date.txt

然后用 lsattr 检查一下:

lsattr date.txt

输出会像这样:

  —-i——–e– date.txt

我们可以测试一下用 rm 指令删除这的文件:

rm date.txt

这时候应该就会出现这样的信息:

  rm: remove write-protected regular file ‘date.txt’?

就算回答 y,也还是会出现不可以改动的错误信息:

  rm: cannot remove ‘date.txt’: Operation not permitted

而且就算用管理者权限执行删除的指令:

sudo rm date.txt

还是一样:

  rm: cannot remove ‘date.txt’: Operation not permitted

这样就可以确保文件不会被误删。

如果真的要删除这个文件,就先必须把 i 属性拿掉才行:

  sudo chattr -i date.txt

  rm date.txt

如果需要将整个目录底下所有的文件都加上 i 属性,可以使用 -R 参数,例如:

sudo chattr -R i /etc

让文件只能增加内容,不能删除

有些重要的系统记录档也是常常会需要保护的对象,但这些纪录档会不断的升级,无法直接使用 i 属性,如果想要避免误删这类的文件,可以使用 a 属性,设置这个属性可以让文件只能增加内容,不可以删除或覆写,例如:

sudo chattr a /var/log/syslog

最后提醒一点,如果您将设置有 i 或是 a 属性的文件复制成另外一个新的文件时,这些属性并不会跟着被复制,所以如果新的文件也需要被保护,就要重新设置。

评论0

没有账号? 注册  忘记密码?