chattr 修改文件属性

作用

Linux 中一个文件除了权限、时间戳、大小等基本属性之外,还有一些高级的属性特征,比如:一个文件为了安全起见,可以将其设置成任何用户(包括超级用户 root)都不能删除的属性。还有,不管对文件做任何操作,也不修改文件的最后访问时间等。

chattr 命令则是用来修改文件的高级安全属性(chmod 命令只能设置文件的访问权限,这属于文件的简单的低级的安全访问策略)。

文件具有 8 个安全属性信息,这些属性如下:

  • a:让文件或目录仅供附加用途。 

  • b:不更新文件或目录的最后存取时间。 

  • c:将文件或目录压缩后存放。 

  • d:将文件或目录排除在倾倒操作之外。 

  • i:不得任意更动文件或目录。 

  • s:保密性删除文件或目录。 

  • S:即时更新文件或目录。 

  • u:预防以外删除。 

语法

chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

参数

  • -R  递归处理,将指定目录下的所有文件及子目录一并处理。 

  • -v<版本编号>  设置文件或目录版本。 

  • -V  显示指令执行过程。

  • +<属性>  开启文件或目录的该项属性。 

  • -<属性>  关闭文件或目录的该项属性。 

  • =<属性>  指定文件或目录的该项属性。

示例

(1)让某个文件只能往里面写/覆盖数据,但不能删除文件,适用于各种日志文件、配置文件(缺少配置文件可能会导致程序不能正常启动)。如下:

hxstrive@course:~/Desktop$ sudo chattr +a /home/hxstrive/Desktop/error.log 
[sudo] password for hxstrive: 
hxstrive@course:~/Desktop$ lsattr /home/hxstrive/Desktop/error.log 
-----a--------e------- /home/hxstrive/Desktop/error.log

上面给 error.log 日志文件添加了 a 属性,表示改文件只能追加内容不能删除。如果我们非要去删除这个文件呢?效果如下:

hxstrive@course:~/Desktop$ ll error.log 
-rw-rw-r-- 1 hxstrive hxstrive 0  6月 25 13:51 error.log
hxstrive@course:~/Desktop$ rm error.log 
rm: cannot remove 'error.log': Operation not permitted

如果该文件确实已经不需要了,需要删除掉。该怎么做呢?你可能第一时间想到的是,直接使用 sudo 权限去删除,很遗憾删除失败。如下:

hxstrive@course:~/Desktop$ sudo rm error.log 
rm: cannot remove 'error.log': Operation not permitted

那该怎么做呢?和添加 a 属性一样,同样需要使用 chattr 命令先将文件的 a 属性删除掉,然后再使用 rm 命令删除,即可。如下:

hxstrive@course:~/Desktop$ sudo chattr -a error.log 
hxstrive@course:~/Desktop$ rm error.log

(2)使用 chattr 防止修改 source.txt 文件

# 先查看文件属性
hxstrive@hxstrive:~$ lsattr source.txt
--------------e------- source.txt

# 使用普通用户修改文件属性,失败,没有权限
hxstrive@hxstrive:~$ chattr +i source.txt
chattr: Operation not permitted while setting flags on source.txt

# 使用 root 用户修改文件权限
hxstrive@hxstrive:~$ sudo chattr +i source.txt
[sudo] password for hxstrive:

# 再次查看文件权限
hxstrive@hxstrive:~$ lsattr source.txt
----i---------e------- source.txt

(3)让某个文件只能往里面追加数据,不能删除。这非常适合各种日志文件:

# 修改文件属性,只允许追加
hxstrive@hxstrive:~$ sudo chattr +a demo.txt

# 追加两条数据到 demo.txt 文件
hxstrive@hxstrive:~$ echo hello >> demo.txt
hxstrive@hxstrive:~$ echo world >> demo.txt

# 替换 demo.txt 文件中的内容,但是没有权限
hxstrive@hxstrive:~$ echo hello world > demo.txt
-bash: demo.txt: Operation not permitted

# 查看 demo.txt 文件内容
hxstrive@hxstrive:~$ cat demo.txt
hello
world

更多关于命令详细参考手册,请使用 man 命令或者 --help 参数获取帮助信息

关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号