Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux file 命令識別文件類型實戰:無擴展名文件的「鑑定大師」

編輯:關於 Linux

Linux 不依賴擴展名判斷文件類型,file 命令通過讀取文件魔數、元數據、文本特徵,精準識別文件真實身份。本文詳解 file 工作原理、輸出解讀、常用參數、批量識別、腳本集成、魔數數據庫 (/etc/magic) 定製。

一、核心原理:三級檢測機制

  1. 文件系統層面:stat() 獲取 inode 信息,判斷是否為目錄、字符/塊設備、FIFO、Socket、符號鏈接。
  2. 魔數匹配:讀取文件前幾百字節,匹配 /etc/magic / /usr/share/misc/magic.mgc 中定義的特征碼 (偏移量、類型、值、掩碼、描述)。如 ELF (0x7F 'E' 'L' 'F')、PNG (0x89 'P' 'N' 'G')、ZIP (PK\\x03\\x04)。
  3. 文本語言猜測:若非二進制格式,分析字符集 (ASCII/UTF-8/UTF-16)、行尾 (LF/CRLF)、關鍵字 (shebang #!/bin/bash、XML 聲明、HTML 標簽) 判斷腳本/文本類型。

二、基本用法與輸出解讀


file filename
file /path/to/file
file -b filename          # 只顯示類型,不顯示文件名
file -z filename          # 解壓查看壓縮文件內部類型 (gzip, bzip2, xz)
file -L filename          # 跟隨符號鏈接檢測目標文件
file -s /dev/sda1         # 檢測塊設備 (需 root)
file -i filename          # 輸出 MIME 類型 (charset)
file -F " | " filename    # 自定義分隔符

輸出示例解析


$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, stripped
# ELF 64-bit LSB shared object  → 64位動態鏈接共享對象 (可執行文件/庫)
# x86-64                        → 架構
# dynamically linked            → 動態鏈接
# stripped                      → 符號表已剝離

$ file /etc/passwd
/etc/passwd: ASCII text
# 純 ASCII 文本

$ file image.png
image.png: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced
# PNG 圖像、分辨率、色深、非隔行

$ file data.zip
data.zip: Zip archive data, at least v2.0 to extract
# ZIP 壓縮包

$ file /dev/sda
/dev/sda: block special (8/0)
# 塊設備

三、實戰場景

1. 識別無擴展名/誤導擴展名文件


$ file suspicious.jpg
suspicious.jpg: ELF 64-bit LSB executable, x86-64 ...  # 實為可執行程序,非圖片!
$ file backup
backup: gzip compressed data, was "backup.tar", last modified: ...
# 實為 gzip 壓縮的 tar 包

2. 批量掃描目錄識別異常文件


find /var/www -type f -exec file {} + | grep -v "ASCII text\|HTML document\|image\|PHP script"
# 過濾掉常見類型,聚焦可疑二進制/腳本

3. 腳本中判斷文件類型分流處理


#!/bin/bash
type=$(file -b --mime-type "$1")
case "$type" in
    image/*)      convert "$1" -resize 50% "thumb_$1" ;;
    application/pdf) pdftotext "$1" "${1%.pdf}.txt" ;;
    text/*)       iconv -f GBK -t UTF-8 "$1" -o "${1%.txt}.utf8.txt" ;;
    *)            echo "Unsupported: $type" ;;
esac

4. 檢測動態庫依賴 (配合 ldd/readelf)


file /usr/lib/libfoo.so
# /usr/lib/libfoo.so: ELF 64-bit LSB shared object, x86-64 ... 確認為共享庫
ldd /usr/lib/libfoo.so  # 查看依賴

四、魔數數據庫定製:識別專有格式

/etc/magic (文本) → file -C 編譯 → /usr/share/misc/magic.mgc (二進制緩存)。


# /etc/magic 追加自定義類型
0       string  MYAPP_MAGIC   MyApp Data File
>:4     string  >\0           Version %s
# 格式: 偏移 類型 匹配值 描述
# > 表示繼續上一行偏移

file -C -m /etc/magic  # 編譯
file -m /etc/magic.mgc myapp.dat  # 使用自定義魔數

五、常見誤區與避坑

  • 文本文件誤判:包含高位字節的文本可能被判為 data。用 file -i 獲取 MIME + charset 輔助判斷。
  • 壓縮文件未深度檢測:默認不解壓。加 -z 參數查看內部類型。
  • 符號鏈接默認檢測鏈接本身:加 -L 跟隨檢測目標。
  • 設備文件需 root:file -s /dev/sda 需讀取設備元數據。

六、總結

file 是 Linux 系統管理、安全審計、腳本自動化、數據恢復中「識別文件真實身份」的權威工具。掌握 -b -i -z -L -s 參數組合、魔數原理、批量掃描模式、自定義魔數擴展,能讓你在面對「不知名文件」時從容鑑定、精準處理。

file 命令識別文件類型示例

Copyright © Windows教程網 All Rights Reserved