Linuxでファイルの種類を確認する方法

Linuxでファイルの種類を確認する方法の実務上の結論は「内容形式はfile、filesystem上の種別はstat %Fで確認し、symbolic linkは参照先とlink自身を分けます。file判定を安全性の保証には使いません。」です。拡張子はhintに留め、inode種別、symlinkの向き、content signatureの順で形式を判定します。判定不能をtext扱いへ倒さず、unknownのまま隔離できる設計にします。

目次

拡張子・inode種別・内容判定を分ける

Linuxでは拡張子は名前の一部であり、fileは先頭byteなどをmagic databaseと照合して内容の候補を返します。statの%Fはregular file、directory、symbolic linkなどinode側の種別です。MIME typeも処理可否や安全性を保証する認証ではありません。三つの観点を分けると、拡張子偽装やlink参照先の取り違えを減らせます。

file –mime-type -bはMIME候補だけを出し、file –mimeはcharsetも示します。symbolic linkの記述を見る既定動作と、-Lで参照先を調べる動作を混同しません。stat –format=’%F %s %n’で種別とsizeを先に取り、readlinkでlink文字列を確認します。大量処理ではfile名の区切りとlocale、magic databaseの版を記録します。

extensionを捨ててinode種別とcontentを確認する

  • 内容形式とobject種別のどちらが必要か決める
  • symbolic linkをfollowするか決める
  • MIME表示を後続処理が期待するか確認する
  • untrusted fileのscan範囲とsize上限を決める

受領元が不明なfileは実行権限の有無にかかわらず開きません。statでregular fileかを確かめ、linkなら参照先を記録し、size上限を超える時やdevice fileならそこで停止して隔離queueへ戻します。

file・stat・readlinkを判定順に使う

内容から形式を推定

file -- ./download.bin

拡張子でなくmagic、内容規則等に基づく説明を得ます。

MIME typeを表示

file --mime-type -- ./download.bin

後続の自動振り分けではcharsetとMIME typeを混同しません。

filesystem object種別を表示

stat --format='%n %F' -- ./download.bin

regular file、directory、symbolic link等を確認します。

symbolic link自身を確認

stat --format='%N %F' -- ./link-name
readlink -- ./link-name

linkの文字列と参照先の存在を別々に扱います。

複数候補をNUL区切りで渡す

find ./incoming -maxdepth 1 -type f -print0 | xargs -0 -r file --mime-type --

spaceやnewlineを含むfile名でも引数境界を保ちます。

fileとstatの結果を安全に読む

fileはfilesystem test、magic database、language testなどを順に使う実装で、結果はmagic database versionによって変わり得ます。stat %Fは内容形式ではなくobject種別です。MIME typeはapplicationの安全性や無害性を証明しません。

『ASCII text』『UTF-8 Unicode text』『data』などはmagic ruleによる説明で、applicationが必ず安全にparseできる保証ではありません。empty、truncated、encrypted、圧縮、自己解凍形式は粗い分類になることがあります。charset判定も全内容の妥当性検査とは限らないため、必要なら対象formatの公式parserで構造を検証します。

read permission不足、broken symlink、走査中の置換、special fileのblockは別々に扱います。pipeやdeviceを通常fileと同じように読むと待機や副作用が起こり得ます。fileがunknownやdataを返しても拡張子から決め打ちせず、size、先頭byte、source、hashを追加確認します。検出失敗をtextとして開くfallbackには接続しません。

unknown・permission denied・broken linkを分類する

  • 拡張子だけで形式を断定する
  • file結果を安全判定とみなす
  • symbolic linkと参照先を混同する
  • MIME typeとcharsetを同じ列にする
  • magic database差による表示変更をerrorとする

fileのunknown、cannot open、broken symbolic linkは別結果です。permission変更で押し通さず、所有者と受領経路を確認します。signatureが短いsampleではfixtureを増やし、期待MIMEと一致するまでconsumerへ渡しません。

未知fileを開かずにMIME候補を記録する

untrusted fileを識別しても実行、preview、macro有効化はしません。decompression bombや巨大file、device fileを対象にしないようstatでsizeとtypeを先に確認します。判定結果をallowlist唯一の根拠にせず、必要ならsandbox scannerへ渡します。

種類確認のためにunknown fileを実行したり、macro対応viewerへ直接渡したりしません。untrusted fileは隔離されたread-only環境で調べ、secretやpersonal dataを外部upload型判定serviceへ送らない方針を先に確認します。device、socket、FIFOは内容を読まずstatで識別し、必要ならownerへ確認して専用手順へ切り替えます。

未知形式を扱う検証手順

拡張子偽装、空file、text、binary、directory、symlink、broken linkのsampleでfileとstatを比較します。tool version、magic database、size、hashを記録し、想定外は隔離したまま確認します。

plain UTF-8、CRLF text、空file、PNG、gzip、拡張子を変えたsample、symbolic link、truncated fileを隔離directoryへ用意します。file通常/-L/–mime-type、stat、readlinkの期待結果を表にし、magic database更新後も差分をreviewします。構造化formatは公式toolのvalidate結果も併記し、単なる表示差と判定変更を分けます。

NUL区切りで形式inventoryを生成する

自動振分けではfileの説明文全文を固定文字列でparseせず、–mime-type -bの値、stat種別、size、終了statusを別列にします。それでもMIMEだけで実行許可を与えず、許可list、signature、format parserを重ねます。判定不能、複数候補、size上限超過は隔離queueへ送り、拡張子を書き換えて処理を続けません。

表示方法を選ぶだけならfileとstatで十分ですが、受入れ検査はformat固有parser、malware検査、signature、source trustを組み合わせます。backupやarchiveではfile種別に加えてowner、mode、xattr、link関係の保持が必要です。目的が『種類を知る』から『安全に開く』へ変わった時点で、単一commandの結果からpolicy判定へ移します。

合格は通常file・directory・symlink・空file・未知binaryのfixtureがそれぞれ期待分類になり、newlineを含むpathもNUL経路で欠落しないことです。不一致は隔離を維持して再判定します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次