lsattr 命令用于显示文件或目录的扩展属性(Extended Attributes)。这些属性提供了比传统文件权限更高级的文件保护机制,可以防止文件被意外删除或修改,是Linux系统中重要的文件安全工具。
lsattr [选项] [文件或目录...]
常用形式:
# 查看单个文件的属性
lsattr 文件名
# 查看目录中所有文件的属性
lsattr 目录名
# 递归查看目录属性
lsattr -R 目录名
| 属性 | 说明 |
|---|---|
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) |
文件删除后内容仍可恢复 |
# 创建测试文件
touch testfile.txt
# 查看文件扩展属性
lsattr testfile.txt
# 输出:-------------e-- testfile.txt
# 常见的输出解释:
# - 表示该属性未设置
# e 表示文件使用extents(ext4文件系统的正常属性)
# 其他字母表示设置了相应的扩展属性
# 创建测试目录和文件
mkdir testdir
touch testdir/file1.txt testdir/file2.txt
# 查看目录中文件的属性
lsattr testdir/
# 输出:
# -------------e-- testdir/file1.txt
# -------------e-- testdir/file2.txt
# 查看目录本身的属性
lsattr -d testdir/
# 输出:-------------e-- testdir/
# 递归查看目录及其所有子目录
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
# 先设置一些特殊属性
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
# 检查关键系统文件是否被保护
lsattr /etc/passwd
lsattr /etc/shadow
lsattr /etc/group
# 检查系统二进制文件
lsattr /bin/ls
lsattr /usr/sbin/sshd
# 如果看到 i 属性,说明文件被设置为不可修改
# 输出示例:----i--------e-- /etc/passwd
# 检查日志文件是否设置为只追加模式
lsattr /var/log/syslog
lsattr /var/log/auth.log
# 只追加模式的文件显示 a 属性
# 输出示例:-----a-------e-- /var/log/syslog
# 这样可以防止日志文件被意外修改或删除
# 但仍然可以追加新的日志内容
# 检查网站文件是否被适当保护
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
# 查找系统中所有设置了不可修改属性的文件
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--"
# 这样可以发现异常的文件保护设置
# 查找所有设置了扩展属性的文件
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--"
#!/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
#!/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
#!/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"
lsattr 和 chattr 是一对互补的命令:
| 命令 | 功能 | 示例 |
|---|---|---|
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
i 和 a)需要root权限才能设置或修改e 属性是正常的,表示使用extents-R 时要小心,对于大目录可能会产生大量输出