您的位置:

Linux下file命令的文件类型识别功能

一、file命令简介

在Linux系统中,我们使用file命令来对文件类型进行识别和分类。file命令可以读取文件的数据,并基于读取的数据和一些算法来判断文件的类型。file命令可以帮助我们快速识别某个文件的类型,无需依赖文件名后缀或者文件的内容进行猜测。

file命令的基本语法如下:

$ file [OPTION]... [FILE]...

file命令常见的参数如下:

  • -b, --brief:只显示文件类型,不包含其它描述信息。
  • -i, --mime:以MIME格式输出文件类型。
  • -k, --keep-going:即使在多个文件的识别过程中出现错误,仍然继续执行,不会停止。
  • -s, --special-files:仅针对特殊类型的文件进行识别。
  • -z, --uncompress:在读取压缩文件时,首先解压缩后再读取。

二、file命令的基本使用

我们先创建一些测试文件,并使用file命令来识别它们的类型:

$ touch test.txt test.jpg test.gz
$ file test.txt
test.txt: empty
$ file test.jpg
test.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=3, manufacturer=EASTMAN KODAK COMPANY, model=KODAK EASYSHARE C743 ZOOM DIGITAL CAMERA, orientation=upper-left, xresolution=113, yresolution=121, resolutionunit=2, software=Adobe Photoshop CS3 Windows, datetime=2015:01:12 12:16:10], baseline, precision 8, 2592x1944, frames 3
$ file test.gz
test.gz: gzip compressed data, was "test", last modified: Fri Sep 14 10:52:11 2018, max compression, from Unix

从上面的测试结果可以看出,file命令可以识别文本文件、图片和压缩文件等多种类型。

三、file命令的高级使用

1. 使用-m参数加载自定义识别库

默认情况下,file命令会根据系统库中的识别规则进行文件识别。我们也可以使用-m参数,在file命令中加载自定义的识别规则。例如:

$ touch test.csv
$ file test.csv
test.csv: empty
$ echo "text/csv" > /tmp/magic
$ file -m /tmp/magic test.csv
test.csv: text/csv

2. 对目录进行文件类型识别

在实际应用中,我们经常需要对一个目录中的文件进行类型识别。此时可以使用find命令来查找所有文件,然后再使用xargs命令来对每个文件执行file命令。例如,在当前目录下进行如下操作:

$ mkdir testdir
$ touch testdir/test1.txt testdir/test2.jpg testdir/test3.gz
$ find testdir -type f -print0 | xargs -0 file
testdir/test1.txt: empty
testdir/test2.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, little-endian, direntries=3, manufacturer=EASTMAN KODAK COMPANY, model=KODAK EASYSHARE C743 ZOOM DIGITAL CAMERA, orientation=upper-left, xresolution=113, yresolution=121, resolutionunit=2, software=Adobe Photoshop CS3 Windows, datetime=2015:01:12 12:16:10], baseline, precision 8, 2592x1944, frames 3
testdir/test3.gz: gzip compressed data, was "test", last modified: Fri Sep 14 10:52:11 2018, max compression, from Unix

上述操作可以对testdir目录下的所有文件进行类型识别,并输出文件类型。

3. 使用file命令进行安全检查

有些恶意文件可能会利用文件类型欺骗用户,执行恶意代码等。为了防止此类攻击,我们可以在系统中设置白名单,只允许特定类型的文件运行。我们可以使用file命令对系统中所有文件进行类型识别,然后与白名单比对,筛选出非法文件。例如,我们在/etc/profile中添加如下命令:

for file in $(find / -type f -print0 | xargs -0 file | grep -v "ASCII text" | awk -F: '{print $1}'); do
  if ! grep -q -f /etc/whitelist.txt <(file -b "$file"); then
    echo "非法文件类型:" "$file"
    rm "$file"
  fi
done

上述命令会查找系统中所有非文本类型的文件,并对其进行类型识别。然后与/etc/whitelist.txt文件中的文件类型进行比对,筛选出非法文件,并直接删除。

四、总结

file命令是Linux系统中一个非常实用的文件类型识别工具,可以帮助我们快速准确地识别各种类型的文件。它支持多种参数,可以自定义识别规则,也可以对目录进行文件类型识别。在安全检查方面,它也有很好的应用价值。作为Linux系统管理员,学习使用file命令必不可少。