chmod 444不能防删除,因删除依赖父目录写权限而非文件自身权限;真正防删须用chattr +i,它在内核层拦截unlink等系统调用,连root也无法绕过,必须sudo chattr -i才能解除。

chmod 444 不能防删除,只移除写权限不等于禁止删
文件能否被删除,取决于其父目录的写权限,而不是文件自身的 w 位。执行 chmod 444 file 后,ls -l file 显示 r--r--r--,但只要父目录(比如 /tmp)对当前用户可写,rm file 就依然成功——因为删操作本质是修改目录项,不是改文件内容。
常见误用场景:
- 运维脚本里只跑
chmod 444 /etc/my.conf,结果 cron 以 root 身份运行时仍能rm /etc/my.conf - 容器内应用以 root 运行,
chmod对它完全无效 - 开发环境共享配置,以为设了 444 就“锁死了”,实际同事仍可
mv config.bak config覆盖
真正防删必须用 chattr +i,连 root 也拦住
chattr +i 是唯一能阻止删除的操作:它在内核层拦截 unlink 系统调用,不管你是普通用户还是 root,只要属性存在,rm、mv、rename 全部报 Operation not permitted。
实操要点:
- 必须用 root 执行:
sudo chattr +i /path/to/file - 验证是否生效:
lsattr /path/to/file输出末尾含i(如----i--------e---) - 目录加
+i后,禁止在其中新建/删除/重命名任何子项(哪怕子文件没加 i) - 解除锁定只能显式执行:
sudo chattr -i /path/to/file,没有“临时绕过”机制
想保留目录可写,但只防关键文件被删?分开加 i
如果父目录本身需要允许新增文件(比如日志目录),但又要防止已有配置文件被删,不能给整个目录加 +i——那样会卡死所有写操作。正确做法是分层控制:
- 对目录本身不加
+i,保持drwxr-xr-x正常可写 - 只对要保护的文件单独加
+i:sudo chattr +i /var/log/myapp/config.json - 这样
touch new.log仍可成功,但rm config.json必然失败 - 注意:
chattr -R +i /dir极危险,一不小心就锁死/etc或/boot,恢复困难
mount -o ro 是整块设备级防护,适合归档盘
当你要保护的不是单个文件,而是一整块设备(如备份硬盘、NFS 只读挂载点),mount -o ro 比逐个加 i 更自然、更彻底:
- 临时挂载为只读:
sudo mount -o ro /dev/sdb1 /mnt/archive - 已挂载后重挂:
sudo mount -o remount,ro /mnt/archive(部分文件系统不支持 remount,需先umount) - fstab 持久化:
UUID=abcd-1234 /mnt/archive ext4 defaults,ro 0 2,再sudo mount -a测试 - 该方式下,所有文件和子目录统一拒绝写入,且不依赖单个文件属性,也不受
chattr影响
真正防删的关键不在文件自身权限,而在操作发生的上下文层级:删动作由目录控制,chmod 无能为力;chattr +i 直接堵住系统调用入口,但需谨慎使用;整设备级只读则跳过文件粒度,从挂载源头切断。选错层级,防护就形同虚设。











