
Я пытаюсь изучить команды UNIX и играю в эту игру, чтобы учиться, и я действительно застрял в данный момент. Я нахожусь на сервере через ssh, и каталог полон случайных файлов и папок, а пароль для следующего уровня находится внутри одного из файлов. Мне сказали, что файл имеет следующие атрибуты:
- человек читаемый
- 1033 байта
- неисполняемый
Я предполагаю, что мне следует использовать команду find
, и я пробовал, find ! -executable
но она вернула кучу файлов. Единственная человекочитаемая помощь, которую я смог найти в руководстве или онлайн, — это распечатка размеров файлов в человекочитаемом виде. Так что я немного запутался?
Я тоже пробовал, find ~ -size 1033b
но это ничего не дало. Но когда я попробовал, find ~ -size -1033b
он вернул все файлы в каталоге.
решение1
Чтобы отфильтровать понятные человеку имена файлов, можно использовать [:print:]
(печатный)класс персонажаимя. Подробнее о таких классах вы найдете в руководстве по grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Если подумать, требование "человекочитаемости" может относиться к содержимому файла, а не к его имени. Другими словами, вы будете искатьтекстfiles. Это немного сложнее. Как предложил @D_Bye в комментарии, вам следует использовать команду file
для определения типа содержимого файла. Но было бы не очень хорошей идеей бежать file
за конвейером, потому что это усложнит задачу отображения имени файла. Вот что я предлагаю:
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
Вот как вкратце file
работает эта часть:
- The
-exec
предикат выполняетсяsh -c 'file -b $0 | grep -q text' FILENAME
для каждогоFILENAME
, который удовлетворяет всем предыдущим условиям (тип, размер, неисполняемость). - Для каждого из этих файлов оболочка (
sh
) запускает эту короткую командусценарий:file -b $0 | grep -q text
, заменив$0
на имя файла. - The
file
Программа определяет тип содержимого каждого файла и выводит эту информацию. Опция-b
предотвращает печать имени каждого протестированного файла. grep
фильтрует выводfile
программы, ища строки, содержащие"текст". (Посмотрите сами, какfile
выглядит типичный вывод команды.)- Но
grep
не выводит отфильтрованный текст, так как он имеет-q
(тихий) вариант дан. Что он делает, это просто меняет егостатус выходалибо0
(что означает «истина» — отфильтрованный текст был найден), либо 1 (что означает «ошибка» — текст"текст"не появился в выводе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. Настоящая загвоздка в этой задаче в том, что каждый файл начинается с - (дефис).