命令介绍
chattr
命令,专门用来修改文件或目录的隐藏属性,只有 root 用户可以使用。
命令格式
该命令的基本格式为: chattr [+-=] [属性] 文件或目录名
参数说明
符号 |
含义 |
备注 |
+ |
表示给文件或目录添加属性 |
- |
- |
表示移除文件或目录拥有的某些属性 |
- |
= |
表示给文件或目录设定指定的属性 |
- |
-R |
递归更改目录下所有文件和子目录的扩展属性 |
对于目录非常有用 |
-V |
显示命令版本信息 |
无需其他参数 |
-v |
显示修改的文件和属性 |
可以查看哪些文件被修改了 |
扩展属性
选项 |
含义 |
备注 |
a |
如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据;如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件; |
- |
A |
不支持跟踪此文件的atime信息 |
- |
c |
自动压缩文件 |
- |
i |
如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件; |
- |
j |
为所有数据分配连续的空间 |
- |
u |
设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录 |
- |
s |
和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复。 |
- |
S |
同步目录 |
- |
命令实例
基本用法
1.设置文件不可修改属性
这将为 file.txt
文件设置不可修改 (immutable
) 属性。
2.递归设置目录下所有文件的属性
1
| chattr -R +a /path/to/directory
|
这将递归为 /path/to/directory
目录及其子目录下所有文件设置只允许追加 (append-only
) 属性。
3.查看修改的文件和属性
这将为 file.txt
文件设置不可修改属性,并显示哪些文件和属性被修改了。
4.删除文件的扩展属性
这将删除 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
| [root@ubuntu2204-101 ~ 08:26:29]
[root@ubuntu2204-101 ~ 08:26:52] -rwxrwxrwx 1 veazhi veazhi 1439 Sep 8 07:06 permission/shadow
[root@ubuntu2204-101 ~ 08:26:57] ----i---------e------- permission/shadow
[root@ubuntu2204-101 ~ 08:27:19] rm: cannot remove 'permission/shadow': Operation not permitted
[root@ubuntu2204-101 ~ 08:27:28] -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
| [root@ubuntu2204-101 ~ 08:30:51]
[root@ubuntu2204-101 ~ 08:31:54] drwxrwxrwx 3 veazhi veazhi 4096 Sep 8 07:06 permission/
[root@ubuntu2204-101 ~ 08:30:56] ----i---------e------- permission/shadow --------------e------- permission/a
[root@ubuntu2204-101 ~ 08:31:01] touch: setting times of 'permission/test1': No such file or directory
[root@ubuntu2204-101 ~ 08:31:23] cp: cannot create regular file 'permission/dmesg': Operation not permitted
[root@ubuntu2204-101 ~ 08:31:38]
[root@ubuntu2204-101 ~ 08:35:22] 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] [root@ubuntu2204-101 ~ 08:45:57]
[root@ubuntu2204-101 ~ 08:46:08] --------------e------- permission/shadow [root@ubuntu2204-101 ~ 08:47:07] --------------e------- permission/shadow --------------e------- permission/a
|
实例四:为目录设置 a 属性
假设有这样一种应用,我们每天自动实现把服务器的日志备份到指定目录,备份目录可设置 a 属性,变为只可创建文件而不可删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [root@ubuntu2204-101 ~ 08:47:10]
[root@ubuntu2204-101 ~ 08:56:09] -----a--------e------- permission/a/b/c/d --------------e------- permission/a/b/c/group
[root@ubuntu2204-101 ~ 08:56:16]
[root@ubuntu2204-101 ~ 08:56:41] rm: cannot remove 'permission/a/b/c/d/syslog': Operation not permitted
|
注意:
通常情况下,不要使用 chattr 命令修改 /、/dev/、/tmp/、/var/ 等目录的隐藏属性,很容易导致系统无法启动。另外,chatrr 命令常与 lsattr 命令合用,前者修改文件或目录的隐藏属性,后者用于查看是否修改成功。有关 lsattr 命令,放到下节讲解。