MTREE(8)

名称
mtree - ディレクトリ階層をマップする

書式
mtree [-LPUcdeinqrux] [-f spec] [-K keywords] [-k keywords] [-p path] [-s seed] [-X exclude-list]

解説
mtree は、カレントディレクトリをルートとするファイル階層を、 標準入力から読み込んだファイル階層記述と比較します。 その記述とマッチしない特性をもつファイルや、 実際のファイル階層あるいはファイル階層記述のいずれかから欠落しているファイル に関するメッセージを標準出力に出力します。

以下のオプションがあります:

-L  ファイル階層のすべてのシンボリックリンクをたどります。

-P  ファイル階層のシンボリックリンクをたどりません。 代りに、シンボリックリンク自身を比較対象にします。 これがデフォルトです。

-U  既存ファイルの所有者、グループおよびパーミッションを ファイル階層記述に合わせて修正し、欠落しているディレクトリを作成します。 欠落ディレクトリを作成するために、ユーザ、グループおよびパーミッションの 全てを指定しなければなりません。 成功するとステータス 0 で終了し、 何らかのエラーが発生すると 1 で終了します。 ミスマッチがあっても、それが訂正されればエラーとはみなされません。

-c  ファイル階層の記述を標準出力に出力します。

-d  ディレクトリ型以外のファイルは全て無視します。

-e  ファイル階層には存在するが、ファイル階層記述に存在しないファイルが あっても警告しません。

-i  -c オプションでファイル階層記述を作成する際、 ディレクトリレベルを一つ下りる毎に空白 4 つ分ずつインデントして出力します。 各ディレクトリ前に出力される /set 文やコメントには影響を与えませんが、 各ディレクトリの最後に出力されるコメントには影響を及ぼします。

-n  ファイル階層記述作成の際、パス名コメントを出力しません。 -c オプション使用時は通常、各ディレクトリの前後にコメントが出力されます。

-q  静寂モード。 “存在しない” ディレクトリが既に存在するという理由で作成できない場合、文句を言いません。 これは、ディレクトリがシンボリックリンクの場合に発生します。

-r  ファイル階層記述に記載されていないファイル階層に含まれるファイルを 全て削除します。

-u  オプション -U と同様ですが、現ファイル階層がファイル階層記述とマッチしなければ ステータス 2 を返します。

-x  ファイル階層中のマウントポイント以下に降下しません。

-f file
    ファイル階層記述を、標準入力からではなく、ファイル file から読み込みます。

-K keywords
    指定した keywords (空白あるいはコンマで区切ったもの) を 現在のキーワード集合に追加します。

-k keywords
    現在のキーワード集合の代わりに、 ``type'' キーワードおよび 指定した keywords (空白あるいはコンマで区切ったもの) を使用します。

-p path
    ファイル階層のルートディレクトリを、カレントディレクトリではなく path とします。

-s seed
    キーワード cksum が指定されている全ファイルに対する単一のチェックサムを 標準エラー出力に出力します。 チェックサムのシードには指定された値が用いられます。

-X exclude-list
    指定されたファイルは fnmatch(3) パターンを含みます。 これにマッチするファイルはファイル階層記述から除外されます。 1 行に 1 個ずつ記述します。 パターンに ‘/’ 文字が含まれる場合、 (開始したディレクトリとの相対で) パス名全体に対してマッチが取られます。 そうでない場合、ベース名に対してのみマッチが取られます。 exclude-list ファイルにはコメントは許されません。

ファイル階層記述は多くの場合、「キーワード」つまり ファイルに関連した値を指定する文字列から構成されます。 どのキーワードにもデフォルト値はありません。 キーワードに値が設定されていない場合、 そのキーワードに基づいたチェックは行われません。

現在サポートされているキーワードは以下の通りです:

cksum
    cksum(1) ユーティリティで規定されるデフォルトアルゴリズムを用いた ファイルのチェックサム。

flags
    シンボル名のファイルフラグ。これらの名前についての情報は chflags(1) を参照してください。フラグ無しを設定するには、文字列 “none” を指定して、現在のデフォルトに優先できます。

ignore
    このファイル以下のファイル階層を無視します。

gid 数値で指定したファイルのグループ。

gname
    シンボル名で指定したファイルのグループ。

md5digest
    ファイルの MD5 メッセージダイジェスト。

sha1digest
    FIPS ファイルの 160-1 (“SHA-1”) メッセージダイジェスト。

ripemd160digest
    ファイルの RIPEMD160 メッセージダイジェスト。

mode
    数値 (8 進数) あるいはシンボル値で指定した現ファイルのパーミッション。

nlink
    ファイルが持っているはずのハードリンク数。

nochange
    このファイルもしくはディレクトリが存在することのみ確認し、 他の属性は無視します。

uid 数値で指定したファイルの所有者。

uname
    シンボル名で指定したファイルの所有者。

size
    ファイルサイズ (バイト数)。

link
    シンボリックリンクが指し示しているはずのファイル。

time
    ファイルの最終修正時刻。

type
    ファイルタイプ。以下のいずれかを指定します:

    block
        ブロック型スペシャルデバイス
    char
        文字型スペシャルデバイス
    dir ディレクトリ
    fifo
        FIFO
    file
        通常ファイル
    link
        シンボリックリンク
    socket
        ソケット

デフォルトのキーワード集合は flags, gid, mode, nlink, size, link, time, uid です。

ファイル階層記述には 4 つのタイプの行があります。

1 つめのタイプの行はキーワードに大域的な値を設定するもので、 文字列 ``/set'' とそれに続く空白、そしてキーワードとその値のペアの集合を 空白で区切ったものから構成されます。 キーワードとその値のペアはキーワードとそれに続く等号 (``='')、 そして値から成り、空白は含みません。 一旦キーワードが設定されると、再設定あるいは設定解除されるまで その値は変化しません。

2 つめのタイプの行はキーワードの設定を解除するもので、 文字列 ``/unset'' とそれに続く空白、そして 1 つ以上のキーワードを 空白で区切ったものから構成されます。

3 つめのタイプの行はファイル記述を行うもので、 ファイル名とそれに続く空白、そしてゼロ個以上のキーワードと値のペアを 空白で区切ったものから構成されます。 ファイル名の先頭には空白があっても構いません。 ファイル名には 標準的なファイル名マッチング文字 (``['', ``]'', ``?'', ``*'') が含まれて いてもよく、その場合、そのファイル階層に存在するファイルは、 マッチする最初のパターンと関連づけられます。

各キーワードと値のペアはキーワードと等号 (``='')、そして そのキーワードの値から構成され、空白は含みません。 これらの値は、対応するキーワードの大域的な値を変更しませんが、 大域的な値に優先します。

パスは全て相対指定です。 ディレクトリを指定すると、そのディレクトリ階層の中で 更にファイルが検索されます。 これがファイル階層記述における 4 つめのタイプの行です: 文字列 “..” だけが含まれる行は、カレントディレクトリパスを 1 レベル上に上げることを 意味します。

空行および最初の非空白文字がハッシュ記号 (``#'') であるような行は無視されます。

mtree は成功するとステータス 0 で終了し、何らかのエラーが生じると 1 で終了します。 また、ファイル階層がファイル階層記述とマッチしない場合はステータス 2 で 終了します。 ただしオプション -U が指定されている場合は、ステータス 2 はステータス 0 に変換されます。

使用例
「トロイの木馬」に感染したシステムバイナリを検出するには、 以下のように操作することを推奨します。 ファイルシステムに対して mtree -K sha1digest を実行し、その結果のコピーを別マシンか、少なくとも暗号化した形式で ストアします。 出力ファイル自身は md5(1) ユーティリティを用いてダイジェストを作成します。 そして定期的に mtree と md5(1) をオンラインのファイル階層記述に対して走らせます。 クラッカーが手を加えたバイナリに合わせて オンラインのファイル階層記述を変更することは 可能ですが、オリジナルと同じ MD5 ダイジェストをもつ記述を作成するのは 非現実的だと考えらていれます。

-d オプションおよび -u オプションを組み合わせると、ソフトウェア配布やそれに類する処理のために ディレクトリ階層を作成するのに用いることができます。 /etc/mtree に置かれたファイル群は、この FreeBSD 配布のほとんど全てのディレクトリを作成するのに用いられました。

関連ファイル
/etc/mtree
    システムのファイル階層記述ディレクトリ

診断

関連項目
chflags(1), chgrp(1), chmod(1), cksum(1), md5(1), stat(2), fts(3), md5(3), chown(8)

歴史
mtree ユーティリティは 4.3BSD Reno で登場しました。 MD5 ダイジェスト機能は、 cksum(1) をだますプログラムが広範囲に悪用されたのに対抗して FreeBSD 2.1 で追加されました。 新たな攻撃により MD5 の弱さが示されたため、 SHA-1 と RIPEMD160 のダイジェスト機能が FreeBSD 4.0 で追加されました。 ファイルフラグのサポートは FreeBSD 4.0 で追加されました。このほとんどは NetBSD 由来です。