命令介绍

chattr 命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用。

命令格式

该命令的基本格式为: chattr [+-=] [属性] 文件或目录名

参数说明

符号 含义 备注
+ 表示给文件或目录添加属性 -
- 表示移除文件或目录拥有的某些属性 -
= 表示给文件或目录设定指定的属性 -
-R 递归更改目录下所有文件和子目录的扩展属性 对于目录非常有用
-V 显示命令版本信息 无需其他参数
-v 显示修改的文件和属性 可以查看哪些文件被修改了

扩展属性

选项 含义 备注
a 如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件; -
A 不支持跟踪此文件的atime信息 -
c 自动压缩文件 -
i 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件; -
j 为所有数据分配连续的空间 -
u 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录 -
s 和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复。 -
S 同步目录 -

命令实例

基本用法

1.设置文件不可修改属性

1
chattr +i file.txt

这将为 file.txt 文件设置不可修改 (immutable) 属性。

2.递归设置目录下所有文件的属性

1
chattr -R +a /path/to/directory

这将递归为 /path/to/directory 目录及其子目录下所有文件设置只允许追加 (append-only) 属性。

3.查看修改的文件和属性

1
chattr -v +i file.txt

这将为 file.txt 文件设置不可修改属性,并显示哪些文件和属性被修改了。

4.删除文件的扩展属性

1
chattr -i file.txt

这将删除 file.txt 文件的所有扩展属性。

5.设置多个扩展属性

1
chattr +ais /path/to/directory

这将为 /path/to/directory 目录设置只允许追加 (append-only)、不可修改 (immutable) 和同步 (sync) 属性。

扩展用法

1.从文件列表中读取文件并设置属性

1
cat files.txt | xargs chattr +i

这将从 files.txt 文件中读取文件列表,并为每个文件设置不可修改属性。

2.结合 find 命令设置属性

1
find /path/to/directory -type f -exec chattr +i {} +

这将在 /path/to/directory 目录及其子目录下查找所有常规文件,并为每个文件设置不可修改属性。

高级用法

1.设置自动压缩文件属性

1
chattr +c /path/to/file.txt

这将为 /path/to/file.txt 文件设置自动压缩 (compress) 属性。当文件被修改并同步到磁盘时,它将自动压缩以节省磁盘空间。

2.为文件分配连续空间

1
chattr +j /path/to/database.file

这将为 /path/to/database.file 文件设置连续空间 (contiguous) 属性。这对于需要大量连续空间的文件(如数据库文件)非常有用,可以提高性能。

3.结合 lsattr 命令查看属性

1
lsattr -R /path/to/directory | grep '^....i' | awk '{print $9}' | xargs chattr -i

这将首先使用 lsattr 命令递归查找 /path/to/directory 目录及其子目录下设置了不可修改属性的文件,然后提取文件名并使用 chattr 命令删除这些文件的不可修改属性。

以上是关于 chattr 命令的详细文档,包括命令简介、语法格式、参数使用说明、演示实例以及扩展和高级使用方法。chattr 命令是管理文件和目录扩展属性的重要工具之一,掌握它的使用方法对于保护重要数据和维护系统安全性非常有帮助。

实操案例

实例一:给文件赋予 i 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 给文件赋予 i 属性:
[root@ubuntu2204-101 ~ 08:26:29]# chattr +i permission/

# 查看普通权限:
[root@ubuntu2204-101 ~ 08:26:52]# ls -al permission/shadow
-rwxrwxrwx 1 veazhi veazhi 1439 Sep 8 07:06 permission/shadow

# 使用 lsattr 查看该文件的特殊权限:
[root@ubuntu2204-101 ~ 08:26:57]# lsattr permission/shadow
----i---------e------- permission/shadow

# 删除文件:
[root@ubuntu2204-101 ~ 08:27:19]# rm -rf permission/shadow
rm: cannot remove 'permission/shadow': Operation not permitted

# 重写文件内容:
[root@ubuntu2204-101 ~ 08:27:28]# echo 11111 > permission/shadow
-bash: permission/shadow: Operation not permitted

可以看到,当给文件设置 i 属性后,即便是 root 用户,即便文件的普通权限为 777 ,那也无法删除和修改数据。

实例二:给目录赋予 i 属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 给目录赋予 i 属性:
[root@ubuntu2204-101 ~ 08:30:51]# chattr +i permission/

# 查看目录的普通权限:
[root@ubuntu2204-101 ~ 08:31:54]# ls -ld permission/
drwxrwxrwx 3 veazhi veazhi 4096 Sep 8 07:06 permission/

# 使用 lsattr 查看该文件的特殊权限:
[root@ubuntu2204-101 ~ 08:30:56]# lsattr permission/
----i---------e------- permission/shadow
--------------e------- permission/a

# 在设有 i 属性的目录下创建文件:
[root@ubuntu2204-101 ~ 08:31:01]# touch permission/test1
touch: setting times of 'permission/test1': No such file or directory

[root@ubuntu2204-101 ~ 08:31:23]# cp /var/log/dmesg permission/
cp: cannot create regular file 'permission/dmesg': Operation not permitted


# 在设有 i 属性目录下的子目录下创建文件:
[root@ubuntu2204-101 ~ 08:31:38]# cp /var/log/dmesg permission/a/

# 查看:
[root@ubuntu2204-101 ~ 08:35:22]# tree permission/
permission/
├── a
│   ├── b
│   │   ├── c
│   │   │   ├── d
│   │   │   └── group
│   │   └── passwd
│   ├── dmesg
│   └── test2
└── shadow

4 directories, 5 files

一旦给目录设置 i 属性,即使是 root 用户,也无法在设置了 i 属性的目录中新建或删除文件(子目录不受影响),但可以修改文件内容。

实例三:取消 i 属性

给设置有 i 属性的文件删除此属性也很简单,只需将 chattr 命令中 + 改为 - 即可。

1
2
3
4
5
6
7
8
9
[root@ubuntu2204-101 ~ 08:35:29]# chattr -i permission/
[root@ubuntu2204-101 ~ 08:45:57]# chattr -i permission/shadow

# 查看:
[root@ubuntu2204-101 ~ 08:46:08]# lsattr permission/shadow
--------------e------- permission/shadow
[root@ubuntu2204-101 ~ 08:47:07]# lsattr permission
--------------e------- permission/shadow
--------------e------- permission/a

实例四:为目录设置 a 属性

假设有这样一种应用,我们每天自动实现把服务器的日志备份到指定目录,备份目录可设置 a 属性,变为只可创建文件而不可删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 给目录设置 a 属性:
[root@ubuntu2204-101 ~ 08:47:10]# chattr +a permission/a/b/c/d

# 使用 lsattr 查看权限:
[root@ubuntu2204-101 ~ 08:56:09]# lsattr permission/a/b/c/
-----a--------e------- permission/a/b/c/d
--------------e------- permission/a/b/c/group

# 复制一份日志文件到设置了 a 属性的目录中:
[root@ubuntu2204-101 ~ 08:56:16]# cp /var/log/syslog permission/a/b/c/d/

# 删除设置了 a 属性目录下的日志文件:
[root@ubuntu2204-101 ~ 08:56:41]# rm -rf permission/a/b/c/d/syslog
rm: cannot remove 'permission/a/b/c/d/syslog': Operation not permitted

注意:
通常情况下,不要使用 chattr 命令修改 /、/dev/、/tmp/、/var/ 等目录的隐藏属性,很容易导致系统无法启动。另外,chatrr 命令常与 lsattr 命令合用,前者修改文件或目录的隐藏属性,后者用于查看是否修改成功。有关 lsattr 命令,放到下节讲解。