web-dev-qa-db-ja.com

実行可能なファイルタイプを見つける方法は?

カーネルの観点から実行可能なファイルタイプを見つけたい。私の知る限り、Linuxのすべての実行可能ファイルはELFファイルです。したがって、私は以下を試しました:

find * | file | grep ELF

ただし、これは機能しません。誰か他のアイデアはありますか?

7
JohnnyFromBF

後で編集:この1つだけがjanに必要なことを行います。

find . -exec file {} \; | grep -i elf

11
fromnaboo

find-executableフラグをご覧ください。

バイナリ実行可能ファイルはそのタイプのファイルに属しているため、最初に通常のファイルを探します。

次に、通常のファイルごとにMIMEタイプを要求し、それがapplication/x-executableと一致する場合、それはバイナリ実行可能ファイルです(Linux実行可能ファイルと一致する必要があり、たとえばWindowsはapplication/x-dosexecと一致します)。

find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"

このコマンドを試してみましたが、find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF。コマンドfileはバグがあり、ELF実行可能ファイルをELF共有オブジェクトとして検出するようです。したがって、コマンドは理論的には正しいものの、実際には不完全です。

したがって、ELF実行可能ファイルと共有オブジェクトを探す必要がありますが、*。soおよび。so。という名前のすべてのファイルを除外します

find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"

それはおそらく完璧ではありませんが、それはかなり近いです。

1
Huygens

他の人のように、私も答えたいです。私の回答もfindユーティリティの使用に基づいていますが、他の回答とは異なる考えがあります。その事実に基づいて、-execも検索条件として使用できます。これを念頭に置いて、これまでの提案をすべてこれにリファクタリングできます。

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

つまりgrep-execに移動しました。

これは私たちに何を与えますか、あなたは尋ねるかもしれませんか? -printおよびfindユーティリティのその他の柔軟性を使用できます。たとえば、好みに応じて出力をフォーマットしたり、-print0を使用して出力をスクリプトなどにリダイレクトしたりできます。

0
Serge Roussak

私は、各一致にelfヘッダーがあることを確認することによってバイナリ実行可能ファイルを見つけることが目的であった場合、これが元の質問に答えると思います。

タイプ-executableに基づいてファイルを前処理し、明示的にexecutableであるヘッダーに一致するgrepにパイプするreadelf -lを呼び出す別のシェルを介して結果を実行します。このテストに合格したものはすべて、出力のためにprintfに渡されます。

pwdビットはフルパスを出力します。

find `pwd` -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;
0
noabody