Команди 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який задовольняє всі попередні умови (типу, розмір, не виконує, той).
  • Для кожного з цих файлів оболонка ( sh) запускає цей короткий сценарій : file -b $0 | grep -q textзамінюючи $0ім'я файлу.
  • fileПрограма визначає тип вмісту кожного файлу і виводить цю інформацію. Ця -bопція запобігає друку імені кожного перевіреного файлу.
  • grepфільтрує вихід, що надходить з fileпрограми, шукаючи рядки, що містять "текст" . (Побачте самі, як fileвиглядає типовий вихід команди.)
  • Але grepне виводить відфільтрований текст, тому що в ньому є -q(тиха) опція. Що це робить, це просто змінити свій статус виходу на або 0(що являє собою "справжнє" - відфільтрований текст знайдено), або 1 (що означає "помилка" - текст "текст" не відображався у висновку з file).
  • Справжній / хибний статус виходу, що надходить grep, передається далі shдо findта виступає кінцевим результатом всього -exec sh -c 'file $0 | grep -q text' {} \;тесту " " тесту.
  • У випадку, якщо вищевказаний тест повернеться істинним , -printкоманда виконується (тобто друкується ім'я тестованого файлу).

Я знаю, що це старе, але хочу додати, що використання find . -type f -size 1033cтакож поверне такий самий відповідь.
Брендон Бенефілд

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

Зауважте, що я використовував cзамість bрозміру файлу. bє для 512 байтових блоків. cпризначено для фактичних байтів.


2
Я не думаю, що -readableозначає для людини зрозумілий (тобто не двійковий)
hhaamu

1
@hhaamu - правильно. Однак, мабуть, непогано відфільтрувати файли, користувач яких не має прав читати! Для того, щоб визначити, чи файл містить вміст, прочитаний людиною, передайте імена, повернуті findдо file.
D_Bye

2

все, що я написав:

find -size 1033c ! -executable

і дістав файл. Мабуть, людська читабельна частина полягала у тому, щоб відкинути тебе.


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

-читаемий означає, що файли можуть бути прочитані обліковим записом, що не робить їх обов’язково читатими людьми.
Антон

0

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

file ./* 

Ви отримуєте повернення, в якому перераховано те, з чого складається кожен файл. Це дуже добре спрацювало над тим, що ви намагаєтеся досягти в грі Bandit. Справжня куля кривої для цього завдання полягає в тому, що кожен файл починається з - (дефіс).


Ви можете покращити це, додавши дефіс до цієї команди, як file ./-*ця.
ConstantFun

0

Я думаю, що це найкраща реальна відповідь, яка охоплювала б усі 3 умови

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

Але, як багато хто казав, виконаний і читаний для людей мав би відкинути нас, так використовуючи

find inhere/ -type f -size 1033c 

цілком достатньо!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.