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 参数获取帮助信息