在linux系统中,基础的文件读写执行权限由chmod命令管理,但仅通过rwx权限无法实现可写不可删除的需求,这时候需要用到chattr命令修改文件的扩展属性,结合基础权限就能达成目标。

一、核心原理说明
linux的ext系列、xfs等常见文件系统支持扩展属性,其中immutable(不可变)属性是最常用的属性之一。当文件被设置immutable属性后,即使是root用户也无法删除、重命名该文件,也不能修改文件的链接数,但如果是普通文件,依然可以通过写入操作追加或修改内容,前提是文件有对应的写权限。
二、具体设置步骤
1. 确认文件系统支持扩展属性
大部分主流linux文件系统默认支持扩展属性,可通过以下命令查看文件系统类型:
# 查看根目录所在文件系统类型 df -T / # 输出示例:/dev/sda1 ext4 1024M 500M 524M 50% /
2. 设置文件基础写权限
首先通过chmod给文件设置写权限,比如给test.log文件设置所有用户可写:
# 设置文件所有用户可写 chmod a+w test.log # 查看权限 ls -l test.log # 输出示例:-rw-rw-rw- 1 root root 0 1月 1 10:00 test.log
3. 添加immutable属性
使用chattr命令的+i参数给文件添加immutable属性:
# 添加immutable属性,需要root权限 sudo chattr +i test.log # 查看文件扩展属性 lsattr test.log # 输出示例:----i---------e----- test.log # 其中i就代表immutable属性,e代表ext4文件系统默认属性
4. 验证效果
此时尝试删除或重命名文件会失败,写入内容则正常:
# 尝试删除文件,会提示权限不足 rm test.log # 输出:rm: 无法删除'test.log': 不允许的操作 # 尝试写入内容,正常执行 echo "new log content" >> test.log cat test.log # 输出:new log content
三、移除immutable属性
如果需要恢复文件的删除权限,使用chattr的-i参数移除属性即可:
# 移除immutable属性 sudo chattr -i test.log # 再次查看属性,i标记消失 lsattr test.log # 输出:--------------e----- test.log # 此时可以正常删除文件 rm test.log
四、注意事项
- chattr命令需要root权限才能执行,普通用户即使对文件有写权限也无法修改扩展属性
- immutable属性对目录同样生效,设置目录为immutable后,目录内的文件无法被删除、新增,但已有的文件如果本身有写权限依然可以修改内容
- 部分特殊文件系统(如fat32、ntfs挂载到linux)不支持扩展属性,无法使用chattr命令
- 如果只需要禁止删除但允许修改内容,不需要额外设置特殊权限,基础写权限加immutable属性即可满足需求
五、常用chattr参数说明
| 参数 | 含义 | 适用场景 |
|---|---|---|
| +i | 添加immutable属性,禁止删除、重命名、修改链接数 | 保护重要文件不被误删 |
| +a | 添加append属性,只允许追加内容,不允许修改、删除已有内容 | 日志文件只追加不修改历史内容 |
| -i | 移除immutable属性 | 恢复文件删除权限 |
| -a | 移除append属性 | 允许修改日志文件历史内容 |
六、代码示例:批量设置日志文件可写不可删
如果需要批量给/var/log目录下的所有log文件设置可写不可删,可使用以下脚本:
#!/bin/bash
# 遍历/var/log目录下所有.log文件
for file in /var/log/*.log; do
# 设置所有用户可写
chmod a+w "$file"
# 添加immutable属性
chattr +i "$file"
echo "已处理文件:$file"
done
执行该脚本后,所有指定的日志文件都只能追加写入内容,无法被删除或修改已有内容,有效保障日志文件的完整性。
linuxchattr文件权限immutable属性ext4文件系统修改时间:2026-06-17 15:09:39