UNIXコマンド-検索


9

私はUNIXコマンドを習得しようとしていますが、このゲームをプレイして習得していて、今は本当に行き詰まっています。私はsshを介してサーバーにいて、ディレクトリはランダムなファイルとフォルダーでいっぱいで、次のレベルのパスワードはファイルの1つにあります。このファイルには次の属性があると聞いています。

  • 人間が読める
  • 1033バイト
  • 非実行可能

findコマンドを使用する必要find ! -executableがあると思いますが、試しましたが、ファイルのロードが返されました。マニュアルまたはオンラインで人間が読める唯一のヘルプは、ファイルサイズを人間が読める形式で出力することです。そこで少し迷っていますか?

また、私は試みましたfind ~ -size 1033bが、それは何も返しませんでした。しかし、私が試しfind ~ -size -1033bたとき、ディレクトリ内のすべてのファイルが返されました。


このゲームについてもっと知りたい!
ivanivan 2017年

2
@ivanivan bandit.overthewire.org
avgvstvs 2017

回答:


16

人間が読めるファイル名を除外するために、[: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

これは簡単にfile-partがどのように機能するかです:

  • -exec述語の実行sh -c 'file -b $0 | grep -q text' FILENAME各々についてFILENAME満たすすべての以前の条件(種類、サイズ、非実行)。
  • これらのファイルごとに、シェル(sh)が次の短いスクリプト:を実行し、ファイル名file -b $0 | grep -q textに置き換え$0ます。
  • fileプログラムは、各ファイルのコンテンツタイプを決定し、この情報を出力します。この-bオプションは、テストされた各ファイルの名前を印刷しません。
  • grepfileプログラムからの出力をフィルタリングし、"text"を含む行を検索します。(fileコマンドの典型的な出力がどのように見えるか、実際に見てください。)
  • ただしgrep-q(静かな)オプションが指定されているため、フィルタリングされたテキストは出力されません。それが行うことは、単に終了ステータス0( "true"を表す-フィルターされたテキストが見つかった)または1( "エラー"を意味する-テキスト"text"がからの出力に表示されなかったfile)に変更することです。
  • から来る真/偽の終了ステータスgrepshto によってさらに渡さfindれ、「-exec sh -c 'file $0 | grep -q text' {} \;」テスト全体の最終結果として機能します。
  • 上記のテストがtrueを返した場合-printコマンドが実行されます(つまり、テストされたファイルの名前が出力されます)。

これは古いことはわかっていますが、使用find . -type f -size 1033cするとまったく同じ応答が返されることを追加します。
ブランドンベネフィールド2018

8
find . -type f -readable -size 1033c ! -executable

ファイルサイズのc代わりに使用したことに注意してくださいbb512バイトブロック用です。 c実際のバイト数です。


2
私は-readable人間が読める(つまり、バイナリではない)ことを意味するとは思いません
hhaamu

1
@hhaamu-そうです。ただし、ユーザーが読み取る権限のないファイルをフィルターで除外することはおそらく悪くありません!ファイルに人間が読めるコンテンツが含まれているかどうかを確認するには、findから返された名前をパイプで渡しfileます。
D_Bye

2

私が書いたのは:

find -size 1033c ! -executable

ファイルを取得しました。どうやら人間が読める部分はあなたを捨てることでした。


0
find . -readable -size 1033c \! -executable

-読み取り可能とは、ファイルをアカウントで読み取ることができることを意味します。必ずしも人間が読み取り可能にするわけではありません。
Anthon 2014

0

私はゲームについては正しい構文だと思います:

file ./* 

各ファイルの構成をリストしたリターンが返されます。それはあなたがBanditゲームで達成しようとしていることに本当にうまくいきました。このタスクの実際の曲線ボールは、各ファイルが-(ハイフン)で始まることです。


このようにコマンドにハイフンを追加することで、これを改善できますfile ./-*
ConstantFun

0

これは3つの条件すべてをカバーする最良の実際の答えだと思います

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

しかし、多くの人々が言っ​​たように、実行可能で人間が読めるものは私たちを捨てることでしたので、

find inhere/ -type f -size 1033c 

十分です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.