レベル5のを実行する効率的な方法を見つけようとしています。 OverTheWire盗賊の挑戦

とにかく、私にはたくさんのファイルがあり、次の基準を尊重するファイルは1つだけです。

  • 人間が読める形式
  • サイズが1033バイト
  • 実行不可能

現在、findコマンドを使用しています、最後の2つの基準に一致するファイルを見つけることができます:

find . -size 1033c ! -executable 

しかし、人間が読めないファイルを除外する方法がわかりません。 。その課題に対して私が見つけた解決策は、-readableテストパラメーターを使用しますが、これは機能しないと思います。 -readableはファイルの権限のみを確認し、その内容は確認しませんが、チャレンジの説明ではASCIIファイルなどを要求します。

コメント

  • 人間が読める形式をどのように定義しますか?バイナリではありませんか?
  • ファイルコマンドはあなたの友達です:)
  • 多分重複: stackoverflow.com/questions/14505218/ …
  • 人間は最もインテリジェントな既知の種の1つです’は、コンピューターに精通していることが知られている唯一のファイルでもあります。ファイルの種類を確認し、暗号化されたファイルの暗号化キーを入手できれば、ほとんどのファイルを読み取ることができます。
  • スポイラーアラート!!

回答

はい、

を使用して適切なサイズの実行不可能なファイルを探し、fileを使用してASCIIを確認します。次のようになります。

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII 

質問ただし、onは思ったほど単純ではありません。 「人間が読める」という言葉は、ひどく曖昧な言葉です。おそらく、あなたはテキストを意味します。 OK、でもどんなテキスト?ラテン文字ASCIIのみ?完全なUnicode?たとえば、次の3つのファイルについて考えてみます。

$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo 

これらはすべてテキストであり、人間が読める形式です。それでは、fileがそれらをどのように構成しているかを見てみましょう。

$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable 

つまり、コマンドは、file1のみを検索します(この例のために、これらのファイルが1033文字であると想像してみましょう)。 findを展開して、文字列textを探すことができます:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text 

-wを使用すると、greptextが次のように検出された行のみを出力します。スタンドアロンの単語。その はあなたが望むものにかなり近いはずですが、説明に文字列textが含まれる可能性のある他のファイルタイプがないことを保証することはできません。

回答

-execは主に、次のようなファイルを処理するために使用されます。見つかった場合は、テストとしても機能します。したがって、他の基準に追加できます。

find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \; 

覚えておいてください、grepは、パターンが見つからなかった場合にゼロ以外を返し、sh -c "COMMAND"は評価の結果を返します(有効である限り)。したがって、これはfile <filename>textで終わるものを吐き出すファイルのみを印刷します(例:「UTF-8Unicodetext」または「ASCIItext」)。 「ISO以外の拡張ASCIIテキスト、エスケープシーケンス付き」ではありません。

1行で、xargsを超えるよりも短くなります:

find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \; 

sh -c "file {} | grep "text$""を任意のカスタムコマンドに置き換えることができることに注意してください。非常に複雑なものをチェックしたい場合は、シェルスクリプトを提供し、代わりにそれを使用することをお勧めします。

find . -size 1033c -not -executable -exec is_human_readable.sh {} \; 

長い間実行すると、シェルの履歴よりも保守が簡単になります:

#!/bin/sh file "$@" | grep "text$" > /dev/null 

コメント

  • いいですね!ただし、一致するtext$は、シェルスクリプトとして認識されるものを除外することに注意してください。シバンのあるものはすべてスクリプトとして識別され、完全に人間が読み取れます。
  • @terdon trueですが、スクリプトは実行可能である傾向があります:D。そうは言っても、適切なスクリプトはPDFも認識する必要があります。しかし、一方で、PDFは人間が読み取り可能の画像を含んでいますか?PNGですか?いくつかのテキストの読み取り可能?おそらく。完全なテストは…やりがいがあると思います。

回答

使用する必要があるのは次のとおりです:

find inhere -size 1033c 

パスワードを含む唯一のファイルが表示されます。

コメント

  • + 1033cがより多くのファイルを返すのはなぜですか?それは等号のようなものですか?

回答

find . -size 1033c ! -executable -exec file {} + 

回答

ディレクトリの内容に対して次を実行するだけです。

$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output> 

回答

1033バイトのサイズのファイルは1つだけです。

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

なぜ1033c1033ではないのですか? manページを確認してください

 -size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes) 

ls -lおよびfileコマンドで確認すると、すべての答えが得られます。

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$ 
  1. 人間が読み取れる(ASCII text
  2. サイズが1033バイト(

    出力)

  3. 実行不可(-rw-r-----

回答

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

この組み合わせたコマンドを試してください。私のステーションで動作します。

回答

これを試すことができます

find . -size 1033c ! -executable -exec file {} + 

チャレンジでgrepが許可されていません。パスワードファイルは「ASCIIテキスト、非常に長い行」として報告されます

回答

除外するには人間が読めるファイル名の場合、[:print:]印刷可能文字クラス

の名前。このようなクラスの詳細については、grepのマニュアルを参照してください。

find . -type f -size 1033c -name "[[:print:]]*" ! -executable 

考え直して、「人間が読める」要件は、名前ではなくファイルのコンテンツを参照する場合があります。つまり、 text ファイルを検索することになります。これはもう少し注意が必要です。@としてD_Byeがコメントで提案した場合は、fileコマンドを使用してファイルのコンテンツタイプを判別する必要があります。ただし、file。ファイルの名前を表示するタスクが複雑になるためです。私が提案する内容は次のとおりです。

find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print 

これは、file部分の動作の概要です:

  • -exec 述語はivid =を実行します以前のすべての条件を満たすFILENAMEごとに “843beb3949”>

(タイプ、サイズ、実行不可)。

  • これらのファイルごとに、シェル(sh)は、この短い script を実行します:file -b $0 | grep -q text$0をファイル名に置き換えます。
  • file プログラムは、各ファイルのコンテンツタイプを判別し、この情報を出力します。-bオプションは、テストした各ファイルの名前。
  • grep フィルター プログラム、 “text” を含む行を検索します。 (fileコマンドの一般的な出力がどのように見えるかを自分で確認してください。)
  • しかし、grepはそうではありません。 -q (静かな)オプションが指定されているため、フィルタリングされたテキストを出力します。 終了ステータス0(「true」を表す-フィルタリングされたテキストが見つかりました)または1(「エラー」を意味する)に変更するだけです。 “-テキスト” text “fileからの出力に表示されませんでした。
  • からの真/偽の終了ステータスgrepはさらにshからfindに渡され、全体の最終結果として機能します”-exec sh -c "file $0 | grep -q text" {} \;“テスト。
  • 上記のテストで true が返された場合、-printコマンドが実行されます(つまり、テストされたファイルの名前が出力されます)。
  • 回答

    bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$ 

    コメント

    • ファイルinhere / *とcat / home / bandit4 / inhere / -file07

    を使用するだけです。

    回答

    find -type f ! -executable -size 1033c 

    演習からファイルを取得します

    回答

    find . -type f -size 1033c ! -executable | xargs file | grep text 

    1つのライナーのファン

    回答

    上記で最も説明したこの盗賊レベルのパスワードをfindとgrepを使用して見つけるには、より長い方法が最もわかりやすいコマンドだと思います。

    find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

    しかし、「file」コマンドを使用した後、ディレクトリ全体のファイルタイプをチェックすることで、この方法で人間が読めるファイル(このレベルではASCII)を見つけるのが非常に簡単であることに気付きました。inhereディレクトリは「-filexx」という名前のファイルを保持するか、file ./*

    これが私のアプローチでした。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です