使用背景

chattr命令可以修改 Linux 的文件属性,在类 Unix 等发行版中,该命令能够有效防止文件和目录被意外的删除或修改。文件在 Linux 中被描述为一个数据结构,chattr 命令在大多数现代 Linux 操作系统中是可用的,可以修改文件属性,一旦定义文件的隐藏属性,那么该文件的拥有者和 root 用户也无权操作该文件,只能解除文件的隐藏属性。这就可以有效的避免被误删除。

命令格式

一个完整的命令一般由命令 (chattr),可选项 (option),操作符 (operator) 与属性 (attribute) 组成:

chattr [option] [operator] [attribute]  file

[option] 可选项:

-R, 递归更改目录及其内容的属性。
-V, 详细说明chattr的输出并打印程序版本。
-f, 隐藏大多数错误消息。

[operator] 操作符:

+,追加指定属性到文件已存在属性中
-, 删除指定属性
=,直接设置文件属性为指定属性

[attribute] 属性如下:

a, 只能向文件中添加数据
A,不更新文件或目录的最后访问时间
i, 文件或目录不可改变

使用实例

lsattr 命令检查文件已有属性

-d:如果目标是目录,只会列出目录本身的隐藏属性,而不会列出所含文件或子目录的隐藏属性信息
-R:作用于目录时,会显示所有的子目录和文件的隐藏信息
$ lsattr clash
--------------e------- clash/glados.yaml
--------------e------- clash/clash-linux-386-v1.10.0
--------------e------- clash/Country.mmdb
--------------e------- clash/cache.db
--------------e------- clash/clash-linux-amd64-v1.10.0
--------------e------- clash/dashboard
$ lsattr -d clash
--------------e------- clash

$ lsattr -R clash
--------------e------- clash/glados.yaml
--------------e------- clash/clash-linux-386-v1.10.0
--------------e------- clash/Country.mmdb
--------------e------- clash/cache.db
--------------e------- clash/clash-linux-amd64-v1.10.0
--------------e------- clash/dashboard

clash/dashboard:
--------------e------- clash/dashboard/manifest.webmanifest
--------------e------- clash/dashboard/assets

clash/dashboard/assets:
--------------e------- clash/dashboard/assets/logo.b453e72f.png
--------------e------- clash/dashboard/assets/index.408383.js
--------------e------- clash/dashboard/assets/index.966f8a.css
--------------e------- clash/dashboard/assets/vendor.ca5569.js

--------------e------- clash/dashboard/sw.js
--------------e------- clash/dashboard/workbox-7ce28d.js
--------------e------- clash/dashboard/index.html

禁止对文件test.md重命名,移动或删除,也不能修改其内容

sudo chattr +i test.md

尝试修改该文件,将会被拒绝:

$ rm -f ./test.md
rm: cannot remove './test.md': Operation not permitted

$ echo 'Hello World!' > test.md
bash: ./test.md: Operation not permitted

$ mv ./test.md ./fileDir
mv: cannot move './test.md' to './fileDir/test.md': Operation not permitted

禁止修改文件夹fileDir及文件夹中的数据

mkdir ./fileDir && touch ./fileDir/test.md
sudo chattr +i -R ./fileDir

尝试修改文件夹中的内容:

$ rm -rf ./fileDir
rm: cannot remove './fileDir/test.md': Operation not permitted

允许向文件添加内容,禁止修改或删除内容,禁止移动文件

$ sudo chattr +a ./test.md
$ lsattr ./test.md
-----a--------e--- ./test.md

$ echo "Hello World!" >> ./test.md   # 追加内容 OK
$ echo "hello"> ./test.md            # 修改内容 NO
bash: ./test.md: Operation not permitted

只允许在目录fileDir中建立和修改文件,但是禁止删除、移动文件

sudo chattr +a ./fileDir

取消某个属性

使用-操作符即可:

# 先给文件添加属性a
$ sudo chattr +a ./test.md
$ lsattr ./test.md
-----a--------e--- ./test.md

# 取消属性a
$ sudo chattr -a ./test.md
$ lsattr ./test.md
--------------e--- ./test.md