Я пытаюсь найти эффективный способ справиться с бандитским заданием 5 уровня OverTheWire .
В любом случае, у меня есть куча файлов, и есть только один, который соответствует следующим критериям:
- Человек читаемый
- Размер 1033 байта
- Неисполнительный
Прямо сейчас я использую find
команду и могу найти файлы, соответствующие двум последним критериям:
find . -size 1033c ! -executable
Однако я не знаю, как исключить нечитаемые человеком файлы. Решения, которые я нашел для этой задачи, используют -readable
тестовый параметр, но я не думаю, что это работает. -readable
только смотрит на права доступа к файлам, а не на их содержимое, в то время как в описании запроса запрашивается файл ASCII или что-то в этом роде.
Ответы:
Да, вы можете использовать
find
для поиска неисполняемых файлов нужного размера, а затем использоватьfile
для проверки ASCII. Что-то вроде:Вопрос, однако, не так прост, как кажется. «Человек читаемый» - ужасно расплывчатый термин. Предположительно, вы имеете в виду текст. ОК, а что за текст? Только латинский символ ASCII? Полный Юникод? Например, рассмотрим эти три файла:
Это все текст и человек для чтения. Теперь посмотрим, что
file
из них делает:Итак, приведенная
find
выше команда только найдетfile1
(для примера давайте представим, что эти файлы имеют 1033 символа). Вы можете расширить,find
чтобы искать строкуtext
:С помощью
-w
,grep
будет печатать только те строки, гдеtext
находится как отдельное слово. Это должно быть очень близко к тому, что вы хотите, но я не могу гарантировать, что нет другого типа файла, чье описание может также включать строкуtext
.источник
Хотя
-exec
в основном используется для работы с файлами, которые были найдены, он также может выступать в качестве теста. Поэтому мы можем добавить его к другим вашим критериям:Помните,
grep
возвращает ненулевое значение, когда шаблон не был найден, иsh -c "COMMAND"
возвращает результат оценки (если он действителен). Таким образом, он будет печатать только те файлы, в которых естьfile <filename>
что-то, что заканчиваетсяtext
, например, «UTF-8 Unicode text» или «ASCII text», но не «Non-ISO extended-ASCII text, с escape-последовательностями».В одной строке он даже заканчивается короче, чем переход
xargs
:Имейте в виду, что вы можете заменить
sh -c 'file {} | grep "text$"'
любую пользовательскую команду. Если вы хотите проверить что-то очень сложное, может быть лучше предоставить сценарий оболочки и использовать его вместо этого:который, в конечном счете, легче поддерживать, чем история вашей оболочки:
источник
text$
исключит вещи, распознаваемые как сценарии оболочки. Все, что с шебангом, идентифицируется как сценарий, и оно отлично читается человеком.источник
Вам нужно только использовать:
Это даст вам единственный файл, который содержит пароль.
источник
Просто запустите следующее для содержимого каталога:
источник
Пожалуйста, попробуйте это комбинированные команды. это работает на моей станции.
источник
Вы можете попробовать это
Ваш вызов не позволяет
grep
. файл паролей будет отображаться как «текст ASCII, с очень длинными строками»источник
Чтобы отфильтровать понятные человеку имена файлов, вы можете использовать
[:print:]
( печатное ) имя класса символов . Вы найдете больше о таких классах в руководстве дляgrep
.Во-вторых, «читабельное» требование может относиться к содержимому файла, а не к его имени. Другими словами, вы будете искать текстовые файлы. Это немного сложнее. Как предложено в комментарии @D_Bye, вам следует использовать
file
команду для определения типа содержимого файла. Но было бы неплохо запускатьfile
после канала, потому что это усложнило бы задачу отображения имени файла. Вот что я предлагаю:Вот кратко, как
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
(который представляет «true» - отфильтрованный текст был найден) или 1 (что означает «ошибка» - текст «text» не появился в выходных данныхfile
).grep
передается дальше,sh
кfind
и действует как конечный результат всей «-exec sh -c 'file $0 | grep -q text' {} \;
» тест.-print
команда выполняется (т.е. печатается имя тестируемого файла).источник
источник
достанет вам файл из упражнения
источник
Вентилятор одного лайнера
источник
Я думаю, что более длинный способ найти пароль для этого уровня бандитов, упомянутый большинством выше, с использованием find и grep, является наиболее описательной командой.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Но после использования команды 'file' больше я понял, что довольно легко найти читаемые человеком файлы (иначе ASCII на этом уровне), проверив типы файлов целых каталогов. Каталог inhere содержит файлы с именем -filexx или быстро проверяет весь каталог inhere с помощью
file ./*
Здесь был мой подход.
источник
получит ваш результат
источник