linux lsattr命令

命令简介

lsattr 命令用于显示文件或目录的扩展属性(Extended Attributes)。这些属性提供了比传统文件权限更高级的文件保护机制,可以防止文件被意外删除或修改,是Linux系统中重要的文件安全工具。

注意: lsattr 和 chattr 命令通常只在支持扩展属性的文件系统(如ext2、ext3、ext4)上可用。

语法

lsattr [选项] [文件或目录...]

常用形式:

# 查看单个文件的属性
lsattr 文件名

# 查看目录中所有文件的属性
lsattr 目录名

# 递归查看目录属性
lsattr -R 目录名

常用选项

选项 说明
-R 递归列出目录及其子目录中文件的属性
-a 列出所有文件的属性,包括隐藏文件
-d 以目录方式显示,而不是显示目录内容
-v 显示文件版本/生成号
-V 显示版本信息
-l 以长格式显示属性名称

扩展属性说明

属性 说明
a (append only) 文件只能以追加方式打开,不能删除或修改现有内容
i (immutable) 文件不可修改:不能删除、重命名、修改内容,不能创建链接
A (no atime updates) 不更新文件的访问时间(atime)
c (compressed) 文件在磁盘上自动压缩存储
C (no copy on write) 禁用写时复制(CoW)
d (no dump) 在使用dump备份时跳过此文件
D (synchronous directory updates) 目录更新同步写入磁盘
e (extent format) 文件使用extents映射磁盘块
j (data journaling) 文件数据写入前先记录到日志
s (secure deletion) 文件删除时用零填充磁盘空间
S (synchronous updates) 文件修改同步写入磁盘
t (no tail-merging) 禁用文件尾合并(用于备份)
u (undeletable) 文件删除后内容仍可恢复

基本用法

1. 查看单个文件属性
# 创建测试文件
touch testfile.txt

# 查看文件扩展属性
lsattr testfile.txt
# 输出:-------------e-- testfile.txt

# 常见的输出解释:
# - 表示该属性未设置
# e 表示文件使用extents(ext4文件系统的正常属性)
# 其他字母表示设置了相应的扩展属性
2. 查看目录内容属性
# 创建测试目录和文件
mkdir testdir
touch testdir/file1.txt testdir/file2.txt

# 查看目录中文件的属性
lsattr testdir/
# 输出:
# -------------e-- testdir/file1.txt
# -------------e-- testdir/file2.txt

# 查看目录本身的属性
lsattr -d testdir/
# 输出:-------------e-- testdir/
3. 递归查看目录属性
# 递归查看目录及其所有子目录
lsattr -R /path/to/directory

# 递归查看并显示隐藏文件
lsattr -Ra /path/to/directory

# 示例输出:
# -------------e-- /path/to/directory/file1.txt
# -------------e-- /path/to/directory/subdir/
# -------------e-- /path/to/directory/subdir/file2.txt
4. 查看设置了特殊属性的文件
# 先设置一些特殊属性
sudo chattr +i important_file.txt
sudo chattr +a logfile.log

# 查看属性
lsattr important_file.txt
# 输出:----i--------e-- important_file.txt

lsattr logfile.log
# 输出:-----a-------e-- logfile.log

实际应用场景

场景1:系统文件保护检查
# 检查关键系统文件是否被保护
lsattr /etc/passwd
lsattr /etc/shadow
lsattr /etc/group

# 检查系统二进制文件
lsattr /bin/ls
lsattr /usr/sbin/sshd

# 如果看到 i 属性,说明文件被设置为不可修改
# 输出示例:----i--------e-- /etc/passwd
场景2:日志文件管理
# 检查日志文件是否设置为只追加模式
lsattr /var/log/syslog
lsattr /var/log/auth.log

# 只追加模式的文件显示 a 属性
# 输出示例:-----a-------e-- /var/log/syslog

# 这样可以防止日志文件被意外修改或删除
# 但仍然可以追加新的日志内容
场景3:Web服务器文件安全
# 检查网站文件是否被适当保护
lsattr -R /var/www/html/

# 对于上传目录,不应该设置 i 或 a 属性
# 对于配置文件,可以设置 i 属性防止修改

# 保护配置文件
sudo chattr +i /var/www/html/config.php
lsattr /var/www/html/config.php
# 输出:----i--------e-- /var/www/html/config.php
场景4:安全审计
# 查找系统中所有设置了不可修改属性的文件
find / -type f -exec lsattr {} + 2>/dev/null | grep '\-i\-'

# 查找所有设置了只追加属性的文件
find / -type f -exec lsattr {} + 2>/dev/null | grep '\-a\-'

# 检查用户主目录中受保护的文件
lsattr -Ra /home/* 2>/dev/null | grep -v "-------------e--"

# 这样可以发现异常的文件保护设置

高级用法

1. 结合find命令批量检查
# 查找所有设置了扩展属性的文件
find /path/to/search -type f -exec lsattr {} \; | grep -v "-------------e--"

# 在特定目录中查找受保护的文件
find /etc -type f -exec lsattr {} \; | grep '\-i\-'

# 检查所有设置了只追加属性的日志文件
find /var/log -type f -exec lsattr {} \; | grep '\-a\-'

# 使用xargs提高效率
find /path/to/search -type f | xargs lsattr | grep -v "-------------e--"
2. 在脚本中使用lsattr
#!/bin/bash
# 文件属性检查脚本

check_attributes() {
    local file=$1
    if [ -e "$file" ]; then
        local attrs=$(lsattr "$file" 2>/dev/null | cut -d' ' -f1)
        echo "$file: $attrs"

        # 检查特定属性
        if [[ $attrs == *"i"* ]]; then
            echo "  WARNING: $file is immutable"
        fi
        if [[ $attrs == *"a"* ]]; then
            echo "  INFO: $file is append-only"
        fi
    else
        echo "ERROR: $file does not exist"
    fi
}

# 检查多个文件
for file in "$@"; do
    check_attributes "$file"
done

# 使用示例:./check_attrs.sh /etc/passwd /var/log/syslog
3. 属性监控脚本
#!/bin/bash
# 监控文件属性变化的脚本

MONITOR_FILE="/etc/important.conf"
BASELINE_ATTRS=$(lsattr "$MONITOR_FILE" | cut -d' ' -f1)

echo "监控文件: $MONITOR_FILE"
echo "基准属性: $BASELINE_ATTRS"

while true; do
    CURRENT_ATTRS=$(lsattr "$MONITOR_FILE" | cut -d' ' -f1)

    if [ "$CURRENT_ATTRS" != "$BASELINE_ATTRS" ]; then
        echo "ALERT: 文件属性已改变!"
        echo "之前: $BASELINE_ATTRS"
        echo "现在: $CURRENT_ATTRS"
        echo "时间: $(date)"
        echo "---"

        # 更新基准
        BASELINE_ATTRS=$CURRENT_ATTRS
    fi

    sleep 60
done
4. 批量属性报告
#!/bin/bash
# 生成系统文件属性报告

REPORT_FILE="file_attributes_report.txt"
echo "文件扩展属性报告 - $(date)" > $REPORT_FILE
echo "=================================" >> $REPORT_FILE

# 检查系统关键文件
important_files=(
    "/etc/passwd"
    "/etc/shadow"
    "/etc/group"
    "/etc/sudoers"
    "/etc/ssh/sshd_config"
)

for file in "${important_files[@]}"; do
    if [ -e "$file" ]; then
        attrs=$(lsattr "$file" 2>/dev/null | cut -d' ' -f1)
        printf "%-25s %s\n" "$file" "$attrs" >> $REPORT_FILE
    fi
done

echo "" >> $REPORT_FILE
echo "设置了特殊属性的文件:" >> $REPORT_FILE
find /etc -type f -exec lsattr {} \; 2>/dev/null | grep -v "-------------e--" >> $REPORT_FILE

echo "报告已生成: $REPORT_FILE"

与chattr命令的关系

lsattrchattr 是一对互补的命令:

命令 功能 示例
chattr 设置/修改文件扩展属性 chattr +i file.txt
lsattr 显示文件扩展属性 lsattr file.txt
完整的使用流程
# 1. 查看当前属性
lsattr important_file.txt
# 输出:-------------e-- important_file.txt

# 2. 设置不可修改属性
sudo chattr +i important_file.txt

# 3. 验证属性设置
lsattr important_file.txt
# 输出:----i--------e-- important_file.txt

# 4. 尝试删除文件(会失败)
rm important_file.txt
# 输出:rm: cannot remove 'important_file.txt': Operation not permitted

# 5. 移除属性
sudo chattr -i important_file.txt

# 6. 再次验证
lsattr important_file.txt
# 输出:-------------e-- important_file.txt

注意事项

  • lsattr 命令通常需要读取权限来查看文件属性
  • 某些属性(如 ia)需要root权限才能设置或修改
  • 扩展属性是文件系统相关的功能,不同文件系统支持不同的属性
  • 在大多数ext4文件系统上,e 属性是正常的,表示使用extents
  • 使用递归选项 -R 时要小心,对于大目录可能会产生大量输出
  • 某些属性设置可能会影响系统性能或功能
  • 在生产环境中修改文件属性前,务必进行测试