レベル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
を使用すると、grep
はtext
が次のように検出された行のみを出力します。スタンドアロンの単語。その はあなたが望むものにかなり近いはずですが、説明に文字列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:~$
なぜ1033c
で1033
ではないのですか? 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:~$
- 人間が読み取れる(
ASCII text
) - サイズが1033バイト(
出力)
- 実行不可(
-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
フィルターfile
コマンドの一般的な出力がどのように見えるかを自分で確認してください。)grep
はそうではありません。 -q
(静かな)オプションが指定されているため、フィルタリングされたテキストを出力します。 終了ステータスを0
(「true」を表す-フィルタリングされたテキストが見つかりました)または1(「エラー」を意味する)に変更するだけです。 “-テキスト” text “がfile
からの出力に表示されませんでした。grep
はさらにsh
からfind
に渡され、全体の最終結果として機能します”-exec sh -c "file $0 | grep -q text" {} \;
“テスト。-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 ./*
これが私のアプローチでした。