Найти удобочитаемые файлы

14

Я пытаюсь найти эффективный способ справиться с бандитским заданием 5 уровня OverTheWire .

В любом случае, у меня есть куча файлов, и есть только один, который соответствует следующим критериям:

  • Человек читаемый
  • Размер 1033 байта
  • Неисполнительный

Прямо сейчас я использую findкоманду и могу найти файлы, соответствующие двум последним критериям:

find . -size 1033c ! -executable

Однако я не знаю, как исключить нечитаемые человеком файлы. Решения, которые я нашел для этой задачи, используют -readableтестовый параметр, но я не думаю, что это работает. -readableтолько смотрит на права доступа к файлам, а не на их содержимое, в то время как в описании запроса запрашивается файл ASCII или что-то в этом роде.

j.doe
источник
1
Как вы определяете человека читаемым? Не бинарный?
Тердон
2
Файл команды твой друг :)
Ромео Нинов
Возможно, дубликат: stackoverflow.com/questions/14505218/…
zuazo
3
Люди - один из самых умных известных видов на земле. Они также единственные, кто знаком с компьютерами. Они могут читать большинство файлов при условии, что они могут определить тип и получить ключи шифрования для зашифрованного.
Стефан Шазелас
1
ОСТОРОЖНО, СПОЙЛЕРЫ!!
Дэн Болсер

Ответы:

17

Да, вы можете использовать findдля поиска неисполняемых файлов нужного размера, а затем использовать fileдля проверки ASCII. Что-то вроде:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

Вопрос, однако, не так прост, как кажется. «Человек читаемый» - ужасно расплывчатый термин. Предположительно, вы имеете в виду текст. ОК, а что за текст? Только латинский символ ASCII? Полный Юникод? Например, рассмотрим эти три файла:

$ cat file1
abcde
$ cat file2
αβγδε
$ cat file3
abcde
αβγδε
$ cat file4
#!/bin/sh
echo foo

Это все текст и человек для чтения. Теперь посмотрим, что fileиз них делает:

$ file *
file1: ASCII text
file2: UTF-8 Unicode text
file3: UTF-8 Unicode text
file4: POSIX shell script, ASCII text executable

Итак, приведенная findвыше команда только найдет file1(для примера давайте представим, что эти файлы имеют 1033 символа). Вы можете расширить, findчтобы искать строку text:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text

С помощью -w, grepбудет печатать только те строки, где textнаходится как отдельное слово. Это должно быть очень близко к тому, что вы хотите, но я не могу гарантировать, что нет другого типа файла, чье описание может также включать строку text.

Тердон
источник
4

Хотя -execв основном используется для работы с файлами, которые были найдены, он также может выступать в качестве теста. Поэтому мы можем добавить его к другим вашим критериям:

find . \
  -size 1033c \
  -not -executable \
  -exec sh -c 'file {} | grep "text$"' \;

Помните, grepвозвращает ненулевое значение, когда шаблон не был найден, и sh -c "COMMAND"возвращает результат оценки (если он действителен). Таким образом, он будет печатать только те файлы, в которых есть file <filename>что-то, что заканчивается text, например, «UTF-8 Unicode text» или «ASCII text», но не «Non-ISO extended-ASCII text, с escape-последовательностями».

В одной строке он даже заканчивается короче, чем переход xargs:

find . -size 1033c -not -executable -exec sh -c 'file {} | grep "text$"' \;

Имейте в виду, что вы можете заменить sh -c 'file {} | grep "text$"'любую пользовательскую команду. Если вы хотите проверить что-то очень сложное, может быть лучше предоставить сценарий оболочки и использовать его вместо этого:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \;

который, в конечном счете, легче поддерживать, чем история вашей оболочки:

#!/bin/sh
file "$@" | grep "text$" > /dev/null
Zeta
источник
Ницца! Обратите внимание, однако, что сопоставление text$исключит вещи, распознаваемые как сценарии оболочки. Все, что с шебангом, идентифицируется как сценарий, и оно отлично читается человеком.
Тердон
@terdon верно, но сценарии, как правило, исполняемые: D. При этом, правильный скрипт должен также распознавать PDF-файлы. Но с другой стороны, является ли PDF, содержащий изображение, читаемым человеком ? Является PNG некоторого текста читаемым ? Наверное. Я думаю, что полный тест будет ... сложным.
Зета
2
find . -size 1033c ! -executable -exec file {} +
user305801
источник
1

Вам нужно только использовать:

find inhere -size 1033c

Это даст вам единственный файл, который содержит пароль.

BugHunterUK
источник
почему + 1033c возвращает больше файлов? это как знак "больше или равно"?
Сейтлин
1

Просто запустите следующее для содержимого каталога:

$ file -- *
-file00: data
-file01: data
-file02: data
-file03: data
-file04: data
-file05: data
-file06: data
-file07: ASCII text
-file08: data
-file09: data
$ cat -- \-file07
<output>
t0lkim
источник
0
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: '{print $1}'

Пожалуйста, попробуйте это комбинированные команды. это работает на моей станции.

Фенбо Ву
источник
0

Вы можете попробовать это

find . -size 1033c ! -executable -exec file {} +

Ваш вызов не позволяет grep. файл паролей будет отображаться как «текст ASCII, с очень длинными строками»

Эммануэль
источник
0

Чтобы отфильтровать понятные человеку имена файлов, вы можете использовать [: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команда выполняется (т.е. печатается имя тестируемого файла).
Alfran
источник
0
bandit4@bandit:~$ ls
inhere

bandit4@bandit:~$ file inhere/*


inhere/-file00: data
inhere/-file01: data
inhere/-file02: data
inhere/-file03: data
inhere/-file04: data
inhere/-file05: data
inhere/-file06: data
inhere/-file07: ASCII text
inhere/-file08: data
inhere/-file09: data

bandit4@bandit:~$ pwd 

/home/bandit4

bandit4@bandit:~$ cat /home/bandit4/inhere/-file07

koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~$ 
jesse_b
источник
Просто используйте файл inhere / * и cat / home / bandit4 / inhere / -file07
0
find  -type f ! -executable -size 1033c

достанет вам файл из упражнения

coolhand
источник
0
find . -type f -size 1033c ! -executable | xargs file | grep text

Вентилятор одного лайнера

Темный рыцарь
источник
0

Я думаю, что более длинный способ найти пароль для этого уровня бандитов, упомянутый большинством выше, с использованием find и grep, является наиболее описательной командой.

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

Но после использования команды 'file' больше я понял, что довольно легко найти читаемые человеком файлы (иначе ASCII на этом уровне), проверив типы файлов целых каталогов. Каталог inhere содержит файлы с именем -filexx или быстро проверяет весь каталог inhere с помощьюfile ./*

Здесь был мой подход.

bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: data
./-file07: ASCII text
./-file08: data
./-file09: data

bandit4@bandit:~/inhere$ cat ./-file07
koReBOKuIDDepwhWk7jZC0RTdopnAYKh
дубильщик
источник
-2
du --human-readable | find -not -executable -size 1033c

получит ваш результат

Варун Раторе
источник