ファイル検索しよう(原題: "Finding Stuff"/"ハッカーの為のLinux" Part 2/10)

※この記事は、Hackers Ariseというウェブサイトの「ファイル検索しよう」(原題: "Finding Stuff")を翻訳したものです。

直接OCCUPYTHEWEB氏より許可を頂いております。

この記事を書くに至った経緯については、以下の記事でお話しているので、是非ご参照下さい。

Linux for Hackers(ハッカーのためのLinux)連載開始のお知らせ - 忙しい人のためのサイバーセキュリティニュース

ファイル検索しよう(原題: "Finding Stuff")

ホワイトハッカーになろうとする多くの人の前に、LinuxコマンドラインCLI)操作が最初のハードルとして立ちはだかる。

残念ながら当連載"Linux for Hackers”には、超基本的なCLI Linuxスキルの教育コンテンツは用意されていない。

だが、特にLinuxを使い始めたばかりだと、Linux内のファイル(バイナリ、ディレクトリ、設定ファイル等)の検索に手こずり、フラストレーションが溜まるだろう。

何個かコマンドとテクニックを身に着ける事によって、そうしたフラストレーションを最小限に抑え、Linuxを自在に使いこなすハッカーに大きく近づく事が出来る。

そこで、このチュートリアルでは、コマンドラインからLinux内のファイルを検索するコマンドに焦点を当てていく。

 

locate

Linuxには、コマンドライン上でアプリケーション、コマンド、ファイル等を見つける方法はいくつかある。

その中で最も使いやすいのは、恐らく”locate”コマンドだ。

Locateは、”locate”コマンドの後に任意のキーワードを指定する事で、ファイルシステム全体を対象に検索し、キーワードが見つかるたびにコマンドラインに値を返す。

”locate"コマンドには欠点もある。

一つ目は、ユーザーが望む以上の項目が引っかかり、ターミナル画面全体を覆い尽くすようなケース。

二つ目は、”locateは1日1回更新されるデータベースを使用する。その為、検索対象となるファイルが作成されたばかりだと表示されない事。

例えば今日作成したファイルは、一般的に、明日までは”locate”の検索結果として表示されない。

 

whereis

検索対象がバイナリファイル(Windowsでいう実行ファイル)である事が確かな場合は、Linuxにはバイナリ専用の検索コマンドが用意されている。

それは、”whereis”コマンドだ。

”whereis”は、バイナリの場所だけでなく、manページも返す。

”whereis”で検索すると、下記画像の様に、”aircrack-ng”のバイナリを返すだけでなく、”locate”コマンドのように、”aircrack-ng”を含む全ての検索結果を表示する。

kali > whereis aircrack-ng

which

whichコマンドは、より具体的な検索をするのに役立つ。

PATH環境変数にあるバイナリの場所だけを返すからだ。

kali > which aircrack-ng

 上記のように、PATH環境変数にリストされているディレクトリ内にある1つのバイナリファイルを発見した。

”PATH環境変数”については、今後のチュートリアル記事で詳述する。

今のところは、PATH環境変数は、「OSがコマンドラインで入力したバイナリ(又はコマンド)を参照する場所」とだけ覚えておけば充分だ。

通常/usr/binがその検索対象の1つとなる。

 

find

”find”コマンドは、最も強力かつ柔軟な検索ユーティリティである。

”find”は、任意のディレクトリで検索を開始し、ファイル名などのさまざまなパラメータを指定して検索できる。

更に、次のようなパラメータを指定してファイル検索もできる。

  1. 作成日時と変更日時
  2. オーナー
  3. グループ
  4. パーミッション
  5. サイズ

”find”の基本的な構文は次の通り。

find <directory list to search> <options> <expression>

 

ファイルシステム(ルート)/ディレクトリの先頭からapache2という名前でファイルを検索する場合は、次のように入力する。

kali > find / -type -f -name apache2

 

それぞれ説明すると、

  • /・・・検索を開始するディレクト
  • -type・・・ファイルのタイプ(この例では「普通のファイル」を意味する”-f”)
  • -name ・・・名前による検索(この例ではapache2)

である。

上記の画像を見れば分かる通り、”find”コマンドは、ファイルシステムの先頭から検索を開始し、全てのディレクトリをチェックし、”apache2”とマッチする多くのインスタンスをリストした。

しかし残念なことに、そのような検索は全てのディレクトリを検索するので時間がかかる。

例えば/etcディレクトリ配下だけを調べたいとしよう。

その場合は、/etcディレクトリ配下にあるファイルやサブディレクトリのみ指定して検索する事が出来る。

実際に試してみよう。

kali > find /etc -type f -name apache2

実際に入力してみればわかるが、/etcディレクトリを指定した検索は非常に速い。

画像のよおり、サブディレクトリにあるapache2を発見する事が出来た。

尚、”locate”のような他の検索コマンドとは異なり、”find”コマンドは指定したキーワードと一致する項目のみ表示する事に注意して欲しい。

例えば、apache2ファイルの拡張子が”apache2.conf”などの場合マッチングが行われず、検索結果に表示されない。

この制限は、ワイルドカード(*、?、[])を使用すれば克服できる。

この場合、/etcディレクトリで、apache2で始まり、あらゆる拡張子を持つファイルを(例えば”apache2.conf”)を検索してみよう。

そんな時は、”find”コマンドに次のようなワイルドカードを書く。

kali > find /etc -type f -name 'apache2.*'

ワイルドカードで検索していた名前の周りには、シングルクォーテーションマーク('')を使用し無ければならない。

このコマンドを実行すると、/etcディレクトリにある、”apache2.conf”ファイルをはじめとする”apache2”で始まる2つのファイルが見つかった。

 

grep

コマンドラインを使用するときに、キーワードを指定して特定のファイルや文字列を見つけたい事がある。

その時に便利なのが、キーワードを検索するフィルタの”grep”コマンドだ。

grep”コマンドは、あるコマンドから別のコマンドに出力が”パイプ”されている場合によく使用される。

”パイプ”に関しては今後のチュートリアルで詳述する事にするが、ここで簡単に説明しておこう。

パイプを使うと、あるコマンドの出力を受け取り、別のコマンドに送ることが出来る。

これは、Linuxのみならず、Windowsコマンドプロンプトでも使用できる機能だ。

パイプをを行うには、コマンドの後に”|”を入力する(”|”は、一般的にENTERの上にある)。

例えば、私のLinuxシステム上で実行されているすべてのサービスを見たい場合を考えてみよう。

その際は、”ps”コマンドに、”aux”スイッチを指定する。

kali > ps aux

上記の画像の通り、操作しているシステムで実行されている全てのサービスのリストが表示される。

この長いリストの中で、特定のサービスしか興味がない場合にはどうしたらいいだろうか。

そういう時に、psの出力をgrepにパイプして、キーワードを絞って探す。

例えばapache2サービスが実行されているかどうかを調べるには、次のように入力する。

kali > ps aux | grep apache2

このコマンドを文章にすると、"すべてのサービスを表示し、その出力をgrepに送信して、キーワード”apache2”を探して、その出力のみを表示しろ"という命令である。

上記のように、”grep”コマンドを使うことで他のすべてのサービスを除外し、”apache2”だけが表示する。

 

終わりに

今回のチュートリアル記事は以上となる。

ホワイトハッカーになりたい熱意あふれる新米ハッカーの諸君。

是非次回もお楽しみに。