Linux lsattr 怎样查看文件的不可变属性
如果一个文件明明有写权限却仍然不能修改,或者删除操作提示不符合预期,除了查看 rwx 权限,还要检查文件系统属性。lsattr 专门负责把这层属性列出来:其中 i 表示不可变,a 表示只允许追加。先看属性,再判断权限、挂载和实际操作,排障会比只盯着 ls -l 更快。
官方文档:https://man7.org/linux/man-pages/man1/lsattr.1.html
lsattr查看的是 e2fsprogs 文件属性,不是普通的用户、组和其他用户权限位。- 查看单个文件用
lsattr -- file;查看目录自身用-d,查看隐藏项用-a,递归查看内容用-R。 - 属性字符串里的
i是不可变,a是只追加;e、A、I等字符表达的是另一类文件系统状态。 - 看到属性并不等于已经完成修复。lsattr 只负责读取,最终能否修改还要看权限、文件系统支持和实际操作返回的错误。
先确定 lsattr 查看的是哪一层属性
排查“文件不能改”时,常见误区是把所有限制都归到权限位。普通权限回答的是“当前用户是否有读、写、执行许可”,而文件属性回答的是“文件对象是否带有更底层的行为标记”。i 即使出现在一个权限看起来很宽松的文件上,也会改变修改、删除和重命名这类操作的结果。
lsattr 来自 e2fsprogs 工具集,典型用法是把路径作为操作数传入,然后读取输出中的属性字符。下面这行输出是静态格式示意,用来帮助辨认位置,不代表某台机器的运行结果:
----i---------e------- ./config.yaml
这里最值得先看的不是整串字符的长度,而是是否出现 i、a 等有明确排障含义的标记。若没有这些标记,再回到普通权限、父目录权限、挂载状态和目标程序自身的错误信息继续判断。

用 -a、-d、-R 选对查看范围
同一个目录路径,读者可能想看三种不同对象:目录本身、目录中的普通项目,或者整棵目录树。选项不同,结果的含义也不同,先把查看范围选对,后面的属性判断才不会偏题。
| 写法 | 关注对象 | 适合回答的问题 |
|---|---|---|
lsattr -- file | 单个文件或路径 | 这个对象是否带有特殊属性? |
lsattr -d -- dir | 目录对象自身 | 目录这一层是否带有属性? |
lsattr -a -- dir | 目录中的隐藏项 | 以点开头的项目是否也需要纳入查看? |
lsattr -R -- dir | 目录及其下层内容 | 限制是否出现在某个子目录或文件上? |
#!/usr/bin/env bash set -u target="$1" # -d 查看目录对象本身;不加 -d 时,目录通常会展开到目录内容。 lsattr -d -- "$target" # -a 把隐藏项也纳入目录内容;-R 用于递归查看子目录中的对象。 lsattr -aR -- "$target"
脚本里保留双引号,是为了让带空格的路径作为一个参数传入;-- 则明确划开选项和路径的边界。若只想判断某个目录是否被标成不可变,优先使用 -d,不要直接对目录运行递归命令后从大量结果里猜目录本身的那一行。
识别 i、a 及常见只读标记
属性字符串可以看作文件对象上的一组标记。对“无法修改或删除”的问题,先识别 i 和 a;对文件系统布局或访问行为的解释,再关注 e、A、I 等字符。不要把每个字符都当成权限位,也不要只因为出现了字符就推断所有相关功能都在当前文件系统上可修改。
| 标记 | 阅读方向 | 排障时的边界 |
|---|---|---|
i | 不可变 | 重点检查修改、删除、重命名等操作是否受到属性约束。 |
a | 只追加 | 重点检查操作是否属于追加;普通覆盖写入不能按“有写权限”直接推断成功。 |
e | 使用 extent 映射 | 它描述存储映射状态,不等价于禁止修改。 |
A | 访问时间更新相关标记 | 它描述访问时间行为,不等价于不可读或不可写。 |
I | 目录索引相关标记 | 它描述目录索引状态,不等价于目录权限。 |
#!/usr/bin/env bash
set -u
path="$1"
attrs="$(lsattr -d -- "$path" | awk '{print $1}')"
# 用固定位置前的属性字符串做初筛;真正的修改动作仍要由目标命令报告结果。
case "$attrs" in
*i*)
printf '%s\n' 'immutable-attribute-present'
;;
*a*)
printf '%s\n' 'append-only-attribute-present'
;;
*)
printf '%s\n' 'no-i-or-a-attribute-seen'
;;
esac
这个例子只做读取和分类,不调用 chattr 修改属性。属性字符串的位置和输出格式应以当前系统的 lsattr 为准;如果路径不存在、无法遍历,或者底层文件系统不提供相同属性,应该把命令错误当成新的线索,而不是把空结果当成“没有限制”。

把属性查看接入排障与复查
当结果里出现 i 或 a 时,下一步不应是立即猜测“权限错了”。先记录路径、属性字符串和实际失败操作,再分层排查:
- 确认目标对象:是文件本身、目录本身,还是目录里的某个隐藏项。
- 确认属性层:用
lsattr -d -- path读取对象属性,重点记录i和a。 - 确认权限层:再看用户、组、父目录搜索权限以及程序运行身份。
- 确认环境层:检查挂载、文件系统支持、只读状态和目标程序实际返回的错误。
可以用下面的命令组合留下一个简短的排障记录。输出只是给读者看的命令示例,不把它描述成已在本文环境执行的证据:
#!/usr/bin/env bash set -u path="$1" # 先记录文件系统属性,再记录普通权限,避免把两层信息混在一起。 printf '%s\n' '--- file attributes ---' lsattr -d -- "$path" printf '%s\n' '--- permission view ---' ls -ld -- "$path" # 最终是否能改动,由实际业务操作返回的错误来确认。 printf '%s\n' '--- next step ---' printf '%s\n' 'run the intended operation and keep its error output'
| 看到的现象 | 优先检查 | 不要直接下的结论 |
|---|---|---|
属性串包含 i | 不可变属性、对象类型和实际失败操作 | 只要清掉权限就能修改 |
属性串包含 a | 操作是否为追加,以及目标程序的打开方式 | 任何写入都一定会被允许 |
没有看到 i/a | 普通权限、父目录、挂载和程序错误 | 文件一定可写或可删 |
| 目录结果很多 | 是否需要 -d、-a 或 -R | 第一行就是目标目录本身 |
常见问题
lsattr 和 ls -l 有什么区别?
ls -l 主要展示所有者、组、普通权限、大小和时间等信息;lsattr 读取的是文件系统属性标记。两者应放在同一条排障链里,而不是互相替代。
看到 i 就能直接用 lsattr 清除吗?
不能。lsattr 是查看命令,改变属性通常要用对应的管理工具,并且仍受当前用户权限、文件系统能力和运维策略约束。先确认变更授权,再决定是否修改。
为什么普通目录查看和 -d 的结果不一样?
目录路径既可以被当作“要列出的目录内容”,也可以被当作“目录这个文件系统对象”。-d 明确要求查看目录本身,适合确认目录这一层的属性。
总结来说,lsattr 的价值是把普通权限之外的文件属性显式摆出来。遇到“权限看起来没问题但操作失败”,先用正确的对象范围读出属性,再把 i、a 与普通权限、挂载和实际错误分开判断,结论才不会停留在猜测层面。
Linux journalctl --since --until 怎样按时间截取日志
- 上一篇
- Linux journalctl --since --until 怎样按时间截取日志
- 下一篇
- Linux numfmt 怎样区分十进制和二进制容量后缀
-
- 文章 · linux | 30分钟前 |
- Linux ss -s 怎样快速查看 TCP 连接汇总
- 367浏览 收藏
-
- 文章 · linux | 30分钟前 | Linux · shell · Linux shell 挂载点 mountpoint util-linux 返回码
- Linux mountpoint 怎样判断目录是否是挂载点
- 128浏览 收藏
-
- 文章 · linux | 34分钟前 |
- Linux getent ahosts 怎样查看主机名解析结果
- 140浏览 收藏
-
- 文章 · linux | 40分钟前 |
- Linux cgroup v2 io.latency 保护磁盘服务延迟的配置方法
- 293浏览 收藏
-
- 文章 · linux | 43分钟前 |
- Linux numfmt 怎样区分十进制和二进制容量后缀
- 210浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux journalctl --since --until 怎样按时间截取日志
- 223浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux tsort 怎样识别依赖关系中的循环
- 252浏览 收藏
-
- 文章 · linux | 1小时前 | Linux · Linux systemd.path PathExistsGlob
- Linux systemd.path PathExistsGlob 匹配文件集合的配置方法
- 171浏览 收藏
-
- 文章 · linux | 18小时前 | Linux · Linux tmpfiles.d systemd-tmpfiles 临时目录清理
- Linux tmpfiles.d 临时目录清理规则的部署
- 223浏览 收藏
-
- 文章 · linux | 18小时前 |
- Linux vmstat 指标与 I/O 等待的判断
- 225浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 766次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 764次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 845次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 815次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 643次使用
-
- Golang操作命令行的几种方式总结
- 2022-12-27 426浏览
-
- Golang执行cmd命令行的方法
- 2023-01-20 412浏览
-
- golang执行命令行的实现
- 2023-01-07 109浏览
-
- Go语言中使用urfave/cli命令行框架
- 2022-12-31 386浏览
-
- golang实现命令行程序的使用帮助功能
- 2023-01-09 269浏览

