膨大なファイルの中から特定のマジックバイトを探す

膨大なファイルの中から特定のマジックバイトを探す

特定のファイルタイプを検索する方法を知りたいです。SSH サーバーにアクセスして.jpgファイルを検索しようとしていますが、サーバーの所有者 (私の先生) がすべての拡張子を削除しています。

試してみたところgrep -lr "JFIF"、同じファイル名のディレクトリが多数見つかったため、コマンドで見つかったランダムなディレクトリにジャンプしgrep、そのディレクトリでコマンドを使用しようとしましたcatが、ターミナルでバイナリ全体を表示できませんでした。

また、stringsコマンドは ssh サーバー上でブロックされています。先生は、jpg ファイルを見つける必要があり、このファイルにはシリアル番号 (SN) が含まれていると言っていましたが、どこで見つけられるのかわかりません。

SSH カーディナルが必要な場合は喜んでお渡しします。とにかく、私の先生は、コマンドを使用してfileそれを実行できると言っていましたが、方法がわかりません。

ところで、彼はこう言った (SN)

答え1

自分で問題を解けるように、いくつかヒントを提供したいと思います。

次の手順に従ってください:

  1. fileを実行してのマニュアルを読んでくださいman file
  2. 試してみてfile somefile何が起こるか見てみましょう
  3. file異なるファイルタイプで実行してみる
  4. ここまでで、あるファイルが jpeg 画像であるかどうかを確認する方法が理解できたはずです。
  5. マニュアルを読んでくださいfind(または、Google を使用して、特定のディレクトリとすべてのサブディレクトリ内のすべてのファイルを検索する方法を調べてください)。
  6. 以前使用したコマンドと接続するために-execオプションを使用する方法を確認しますfindfile
  7. これで、必要なディレクトリ内のすべてのファイルのファイルタイプを見つけてリストできるはずです。
  8. 次に、パイプ|grepコマンドについて読んで、JPEG ファイルのみをフィルタリングする方法を確認します。

答え2

まず最初に、私の質問に直接答えなかったことで多くの新しいことを理解することができた@incBrainと@Sergに感謝したいと思います :)。

.jpg私の仕事は拡張子が削除された特定のファイルを見つけることでした。最初に思いついたのは.jpg マジックバイトこれはJFIF、@incBrainの指示に従って、このコマンドを構築できました。

find / -exec file {} \; | grep "JFIF"

その行は、コマンドをコマンドfindにリンクし、両方の&コマンドの出力を取得し、バイナリに含まれるファイルのみを表示するコマンドのパイプ記号を介して入力として転送します。file-execfindfile|grepJFIF.jpg files

私の問題は、実際のところ、特定のシリアル番号を見つけることでした。最初は、シリアル番号はファイルのバイナリに含まれていると思っていましたが、それは間違っていました。その後、奇妙な考えが頭に浮かびました。

ああ!写真がどんなものか見てみましょう。シリアル番号が見つからない場合は、写真を入手することをお勧めします。

SSH から自分のマシンにファイルを転送する良い方法をインターネットで検索したところ、うまく機能するこのコード ブロックを見つけました。

scp [email protected]:/home/example/file.txt /Local_Directory

この回答が将来誰かの役に立つことを願っています :)。

答え3

考えられる解決策の 1 つは、次のとおりです。whichfindを使用して通常のファイルを再帰的にリストし ( -type f)、file各ファイルに対してコマンドを実行します。出力を にリダイレクトして、grepファイル タイプを除外します。

しかし、ここでは、それよりももっと楽しいこと、もっとぎこちないけれど、もっと楽しいことをしたいと思っています。

$ find .  -maxdepth 1 -type f -printf "%f\t" -exec hexdump -n8 {} \;  | awk '/d8ff e0ff 1000 464a/{print $1}'

ご存知かもしれませんが、すべてのファイルfindには、ファイルタイプを指定する最初の 8 バイトがあります。したがって、を使用してすべての通常のファイルを検索し、その名前を出力しますが、その後、最初の 8 バイトを抽出して hexdump を実行し、awk最初の 8 バイトを持つファイル名のみをフィルター処理します。

ここに小さな証拠があります:

$ hexdump -n 10 1450763029649.jpg               
0000000 d8ff e0ff 1000 464a 4649               
000000a

$ hexdump  -C -n 10 1450763029649.jpg           
00000000  ff d8 ff e0 00 10 4a 46  49 46                    |......JFIF|
0000000a

答え4

file * | grep -i "jpeg"

これにより、ディレクトリ内のすべてのファイルが検索され、そのファイル タイプが返されます。パイプを介して|、これらの結果は grep によって検索され、ファイル タイプが "jpeg" のファイル、つまり基本的に .jpg ファイルであるファイルが検索されます。

関連情報