一、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命令必不可少。