UNIXコマンドを学ぼうとしていて、学ぶためにこのゲームをしていますが、今は本当に詰まっています。サーバーに SSH で接続すると、ディレクトリは任意のファイルとフォルダでいっぱいになり、次のレベルのパスワードはファイルのいずれかにあります。ファイルに次の属性があると聞きました。
- 人が読める
- 1033バイト
- 施行できない
私はそのコマンドを使うべきだと思い、find
それを試しましたが、find ! -executable
多くのファイルが返されました。マニュアルやオンラインで人が読むことができる唯一のヒントは、人が読める方法でファイルサイズを印刷することです。それで、私は少し迷子になりましたか?
私も試してみましたfind ~ -size 1033b
が、結果は出ませんでした。しかし、試してみると、find ~ -size -1033b
ディレクトリ内のすべてのファイルが返されました。
答え1
人間が読めるファイル名をフィルタリングするには[:print:]
、印刷可能)キャラクタークラス名前。このクラスの詳細情報はマニュアルにありますgrep
。
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
もう一度考えると、「人間が読める」要件はファイル名ではなくファイルの内容を参照することもできます。つまり、あなたは見つけるでしょうテキスト文書。これは少しトリッキーです。 @D_Byeがコメントで提案したように、そのfile
コマンドを使用してファイルのコンテンツタイプを決定する必要があります。しかし、file
パイプの背後で実行することは、ファイル名を表示する作業を複雑にするので、良い考えではありません。私の提案は次のとおりです。
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
-partの動作方法は次のとおりですfile
。
- これ
-exec
述語は、前のすべての条件(タイプ、サイズ、実行不可)を満たすすべてのsh -c 'file -b $0 | grep -q text' FILENAME
実行を対象としています。FILENAME
- 各ファイルに対して shell(
sh
) がこの短時間実行されます。スクリプト:file -b $0 | grep -q text
、、$0
ファイル名に置き換えられます。 - これ
file
プログラムは各ファイルのコンテンツタイプを決定し、その情報を出力します。この-b
オプションは、各テストファイルの名前が印刷されるのを防ぎます。 grep
file
次を含む行を検索してプログラムの出力をフィルタリングします。「テキスト」。 (file
このコマンドの一般的な出力がどのように表示されるかを直接確認してください。)- ただし、
grep
フィルタ処理されたテキストは出力されません。-q
(静かに)選択をしてください。それがすることはそれを変えるだけだ。終了ステータス("true" - フィルタリングされたテキストを意味) または0
1("false" を意味 - テキスト)「テキスト」file
)の出力には表示されません。 - の true/false 終了状態は に渡され、テスト
grep
全体の最終結果として使用されます。sh
find
-exec sh -c 'file $0 | grep -q text' {} \;
- 上記のテストが返された場合本物、
-print
コマンドが実行されます(つまり、テスト中のファイル名が印刷されます)。
答え2
find . -type f -readable -size 1033c ! -executable
c
ファイルサイズの代わりにファイルサイズを使用していますb
。 b
512バイトブロックに適用されます。 c
実際のバイトの場合。
答え3
私が書いたものは次のとおりです。
find -size 1033c ! -executable
そしてファイルを受け取りました。明らかに人が読める部分は失敗するでしょう。
答え4
ゲームの正しい構文は次のとおりです。
file ./*
各ファイルのコンポーネントが一覧表示された戻りメッセージを受け取ります。これはBanditゲームで達成したい目標に最適です。この作業の実際の変更は、すべてのファイルが-(ハイフン)で始まるということです。