UNIX команды - найти

9

Я пытаюсь изучать команды UNIX, и я играю в эту игру, чтобы учиться, и я действительно застрял на данный момент. Я нахожусь на сервере через ssh, и каталог полон случайных файлов и папок, а пароль для следующего уровня находится внутри одного из файлов. Мне сказали, что файл имеет следующие атрибуты:

  • человек читаемый
  • 1033 байта
  • неисполняемый

Я предполагаю, что я должен использовать findкоманду, и я попытался, find ! -executableно это вернуло загрузку файлов. Единственная читаемая человеком справка, которую я могу найти в руководстве или онлайн, - это распечатка файлов в удобочитаемом формате. Так я там немного растерялся?

Также я попытался, find ~ -size 1033bно это ничего не вернуло. Но когда я попробовал, find ~ -size -1033bон вернул каждый файл в каталоге.

Ник Корин
источник
Мне бы очень хотелось узнать больше об этой игре!
Иваниван
2
@ivanivan bandit.overthewire.org
avgvstvs

Ответы:

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который удовлетворяет все предыдущие условия (типа, размер, неисполняемый).
  • Для каждого из этих файлов shell ( sh) запускает этот короткий скрипт : file -b $0 | grep -q textвместо $0имени файла.
  • fileПрограмма определяет тип содержимого каждого файла и выводит эту информацию. В -bопции предотвращает печать имя каждого тестируемого файла.
  • grepфильтрует выходные данные из fileпрограммы, ища строки, содержащие «текст» . (Убедитесь сами, как fileвыглядит типичный вывод команды.)
  • Но grepне выводит отфильтрованный текст, потому что у него есть -q(тихая) опция. Что он делает, так это просто изменяет свой статус выхода либо 0(который представляет «true» - отфильтрованный текст был найден), либо на 1 (что означает «ошибка» - текст «text» не появился в выходных данных file).
  • Истинный / статус ложного выхода исходя из grepпередается дальше, shк findи действует как конечный результат всей « -exec sh -c 'file $0 | grep -q text' {} \;» тест.
  • Если вышеуказанный тест вернул значение true , -printкоманда выполняется (т.е. печатается имя проверенного файла).
rozcietrzewiacz
источник
Я знаю, что это старый, но я хочу добавить, что использование find . -type f -size 1033cтакже будет возвращать точно такой же ответ.
Брэндон Бенефилд
8
find . -type f -readable -size 1033c ! -executable

Обратите внимание, что я использовал cвместо bразмера файла. bдля блоков 512 байт. cдля фактических байтов.

Тим Пот
источник
2
Я не думаю, что -readableозначает человекочитаемый (то есть не бинарный)
ха-хау
1
@hhaamu - верно. Однако, вероятно, неплохо отфильтровать файлы, которые пользователь не имеет прав на чтение! Для того , чтобы определить , если файл содержит читаемый человек содержание, трубные имена , возвращаемых findв file.
D_Bye
2

все, что я написал, было:

find -size 1033c ! -executable

и получил файл. Видимо, читабельная часть должна была отбросить тебя.

PiousCape262
источник
0
find . -readable -size 1033c \! -executable
eb0t
источник
-читаемый означает, что файлы могут быть прочитаны учетной записью, что не делает их обязательно для чтения человеком.
Энтон
0

Я думаю, что для игры правильный синтаксис:

file ./* 

Вы получаете возврат, в котором перечисляется, из чего состоит каждый файл. Это сработало очень хорошо для того, что вы пытаетесь достичь в игре Бандит. Реальная кривая шара для этой задачи состоит в том, что каждый файл начинается с - (дефис).

ctfred0921
источник
Вы можете улучшить это, добавив дефис в эту команду следующим file ./-*образом.
ConstantFun
0

Я думаю, что это лучший фактический ответ, который охватывает все 3 условия

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

Но, как говорили многие, исполняемый и читабельный человек должны были отбросить нас, поэтому использование

find inhere/ -type f -size 1033c 

вполне достаточно!

bleh10
источник