chattr 完整讲解(Linux 运维常用)

char详解

摘要:本文完整讲解chattr命令语法、高频属性与实操案例,区分它和普通权限的差异,给运维、开发者提供实用的服务器文件安全防护方案。


一、chattr是什么

chattr = change attribute,用来修改 文件 / 目录的隐藏扩展属性。

  • 普通 ls -l 看不到这些属性,就算是 root 用户也会被限制操作,用来保护关键文件防误删、防篡改。
    配套查看命令:lsattr 查看隐藏属性

二、基础语法

javascript 复制代码
chattr [操作符] [属性] 文件/目录

操作符(3 种)

  1. +:增加某个属性
  2. -:移除某个属性
  3. =:只保留指定属性,清空其他所有属性

常用全局选项

  • -R:递归作用到目录下所有文件、子目录
  • -V:显示执行详情

三、最核心 2 个属性(工作 99% 只用这两个)

  1. i = immutable 不可变(最强锁)
    文件加i 后:root 都不能删、改名、覆盖、编辑、硬链接,只能读。

示例

javascript 复制代码
# 给test.txt上锁,禁止任何修改删除
chattr +i test.txt

# 解锁
chattr -i test.txt

# 递归锁住整个目录
chattr -R +i /etc/secure

适用场景 :保护/etc/passwd、/etc/shadow、关键配置文件,防止被篡改、删除。

  1. a = append only 仅追加
    只能用 >> 往文件末尾追加内容;不能覆盖、不能删除、不能修改原有内容。

示例

javascript 复制代码
# 日志文件只允许追加写入,防止删日志毁痕迹
chattr +a /var/log/mysql.log

# 取消追加限制
chattr -a /var/log/mysql.log

适用场景:服务器日志文件,保证日志无法被清空、篡改历史记录。

四、其他次要属性(了解即可)

  • A:访问文件不更新 atime(减少磁盘 IO)
  • d:dump 备份工具忽略该文件
  • S:写入立即同步磁盘,不缓存

五、配套查看 lsattr

javascript 复制代码
# 查看文件隐藏属性
lsattr test.txt

# 查看目录下所有文件
lsattr -a /var/log

输出里出现 i/a 就代表已开启对应保护。

六、实战演示对比

场景 1:文件加 i 锁

javascript 复制代码
chattr +i a.txt
rm -rf a.txt    # Operation not permitted(root也报错)
echo 123 > a.txt # 覆盖写入报错
mv a.txt b.txt   # 改名报错
echo 123 >> a.txt# 追加也报错

场景 2:文件加 a 锁(日志专用)

javascript 复制代码
chattr +a log.txt
echo "new line" >> log.txt # ✅ 允许追加
echo 123 > log.txt         # ❌ 覆盖报错
rm log.txt                 # ❌ 删除报错
vim log.txt                # ❌ 无法修改原有内容

七、注意事项

  • 只有 root 能设置 / 取消 i、a 属性;
  • 该功能只支持 ext3/ext4 文件系统,部分云服务器 XFS 不完全兼容;
  • 系统关键目录 / /dev /tmp 不要随便加 i,极易导致系统崩溃。