Linux глоббинг


Основы Linux

Данный модуль посвещено глоббингу (globbing) в Linux - механизму командной оболочки bash, который позволяет выбирать группы файлов или каталогов по шаблону Даже пройдя всего несколько уровней, Вы уже могли устать каждый раз полностью прописывать все эти пути к файлам, время это автоматизировать. Давайте разберемся как это работает.

Когда вы вводите команду со спецсимволами (джокерами), оболочка сама находит все подходящие имена файлов и подставляет их в команду перед её выполнением.

Основные символы глоббинга:

  • * (звездочка) — любое количество любых символов (включая ноль).
    Пример: ls *.jpg — покажет все файлы с расширением .jpg

  • ? (вопросительный знак) — строго один любой символ.
    Пример: ls file?.txt — найдет file1.txt, но не file12.txt

  • [ ] (квадратные скобки) — один символ из указанного набора или диапазона.
    Пример: ls [a-c]* — файлы, начинающиеся на a, b или c.ls [!0-9]* — файлы, которые не начинаются с цифры

  • { } (фигурные скобки) — перечисление вариантов (строго говоря, это brace expansion, но часто используется вместе с глоббингом).
    Пример: cp {file1,file2}.txt backup/ — скопирует оба файла

Важные особенности:

  • Скрытые файлы: По умолчанию * не находит файлы, начинающиеся с точки (например, .bashrc). Для их поиска нужно явно указывать точку в начале: ls .*.
  • Пустые совпадения: Если ни один файл не подходит под шаблон, bash по умолчанию передаст команде сам шаблон как строку (например, ls *.abc выдаст ошибку, что файл *.abc не найден).

ПРИМЕЧАНИЕ:
Раздел, посвящённый расширениям оболочки в справочном руководстве по bash, может оказаться весьма полезным.


Давайте закрепим и углубим знания на практике.

Первый шаблон глоббинга, с которым мы познакомимся, — это *.

Встретив символ * в любом из аргументов, оболочка трактует его как «подстановочный» знак и пытается заменить этот аргумент всеми файлами, подходящими под шаблон. Проще видеть это на примере, чем в описании:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ touch file_b
hacker@globbing:~$ touch file_c
hacker@globbing:~$ ls
file_a  file_b  file_c
hacker@globbing:~$ echo Look: file_*
Look: file_a file_b file_c

Разумеется, хотя в этом случае подстановка даёт сразу несколько файлов, она столь же легко может совпасть лишь с одним. Например:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ ls
file_a
hacker@globbing:~$ echo Look: file_*
Look: file_a

ВАЖНО:
Когда не совпадает ни один файл, по умолчанию оболочка оставляет шаблон без изменений:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ ls
file_a
hacker@globbing:~$ echo Look: nope_*
Look: nope_*

Символ * может соответствовать любой части имени файла, за исключением символа / и начальной точки .. Например:

hacker@dojo:~$ echo ONE: /ho*/*ck*
ONE: /home/hacker
hacker@dojo:~$ echo TWO: /*/hacker
TWO: /home/hacker
hacker@dojo:~$ echo THREE: ../*
THREE: ../hacker

Отработайте полученные знания на практике. Находясь в домашнем каталоге, перейдите в каталог /challenge, используя глоббинг так, чтобы аргумент, который Вы передаёте команде cd, содержал не более четырёх символов.

Оказавшись там, запустите /challenge/run, чтобы получить флаг!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Теперь давайте познакомимся с символом ?. Когда оболочка встречает символ ? в одном из аргументов, она воспринимает его как подстановочный знак ровно одного символа. Это похоже на *, но * соответствует произвольному числу символов, а ? — строго одному. Например:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ touch file_b
hacker@globbing:~$ touch file_cc
hacker@globbing:~$ ls
file_a  file_b  file_cc
hacker@globbing:~$ echo Look: file_?
Look: file_a file_b
hacker@globbing:~$ echo Look: file_??
Look: file_cc

Давайте отработаем на практике использование символа ?. Находясь в домашнем каталоге, перейдите в каталог /challenge, но используйте в аргументе к команде cd символ ? вместо букв c и l. Когда окажетесь там, запустите /challenge/run, чтобы получить флаг!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Теперь перейдём к шаблону []. Квадратные скобки по сути являются ограниченной разновидностью ?: вместо соответствия любому символу, конструкция [] выступает подстановкой для некоторого подмножества возможных символов, перечисленных внутри скобок.

Например, шаблон [pwn] будет соответствовать символу p, w или n. Рассмотрим пример:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ touch file_b
hacker@globbing:~$ touch file_c
hacker@globbing:~$ ls
file_a  file_b  file_c
hacker@globbing:~$ echo Look: file_[ab]
Look: file_a file_b

Попробуйте теперь сами. Мы подготовили множество файлов в каталоге /challenge/files.
Смените рабочий каталог на /challenge/files и запустите /challenge/run с единственным аргументом, который с помощью квадратных скобок-глобов сопоставится с file_b, file_a, file_s и file_h.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Globbing обрабатывается на уровне полного пути, поэтому с помощью шаблонов Вы можете расширять сразу целые пути, а не только имена файлов.

Например:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ touch file_b
hacker@globbing:~$ touch file_c
hacker@globbing:~$ ls
file_a  file_b  file_c
hacker@globbing:~$ echo Look: /home/hacker/file_[ab]
Look: /home/hacker/file_a /home/hacker/file_b

Теперь очередь за Вами.

Как и в прошлом задании каталоге /challenge/files мы подготовили набор файлов. Находясь в домашнем каталоге, запустите /challenge/run с единственным аргументом, который с помощью квадратных скобок‑глоббинга развернётся в абсолютные пути к файлам file_b, file_a, file_s и file_h.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

До сих пор Вы использовали по одному шаблону глоббинга за раз, но возможностей больше. bash умеет разворачивать несколько шаблонов в рамках одного слова.

Например:

hacker@globbing:~$ cat /*fl*
ctf.school{тут_мог_быть_ваш_флаг}
hacker@globbing:~$

В этом примере оболочка ищет все файлы в каталоге /, имена которых начинаются с чего угодно (включая пустую строку), далее содержат буквы f и l подряд и заканчиваются чем угодно (включая ag, образуя таким образом слово flag).


Теперь закрепим Ваши знания на практике.

Я поместили несколько по-разному названных файлов в каталог /challenge/files. Перейдите туда с помощью cd и выполните /challenge/run, передав один‑единственный аргумент: короткое (не более трёх символов) слово‑шаблон с двумя символами *, которое охватывает все имена, содержащие букву p.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Для создания сложных комбинаций вы можете использовать разные символы глоббинга совместно. Вот список-шпаргалка по пройденному Вами материалу:

  • * — соответствует любой строке, включая пустую (не совпадает с . и / внутри пути).
  • ? — соответствует любому одному символу. 
  • [] — соответствует любому одному символу из указанных в скобках (например, [0-9] — любая цифра).

Теперь давайте объединём приёмы из предыдущих уровней вметсе. Мы поместили несколько по‑разному названных файлов в каталог /challenge/files. Перейдите туда с помощью команды cd и, используя изученный Вами глоббинг, подберите один‑единственный, короткий (не более шести символов) шаблон, который (если передать его как аргумент программе /challenge/run) будет совпадать только с файлами challenging, educational и pwning.

ПОДСКАЗКА:
Внимательно посмотрите на имена файлов в каталоге /challenge/files. Видите ли Вы какие‑то закономерности, которые помогут составить подходящий шаблон?

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Иногда бывает нужно исключить файлы внутри результата глоббинга. К счастью, конструкция [] позволяет Вам сделать и это. Если первым символом внутри квадратных скобок стоит ! или (в более новых версиях bash) ^, то такой шаблон инвертируется, и соответствующее вхождение в скобках начинает совпадать с любыми символами, кроме перечисленных.

Покажем на примере:

hacker@globbing:~$ touch file_a
hacker@globbing:~$ touch file_b
hacker@globbing:~$ touch file_c
hacker@globbing:~$ ls
file_a  file_b  file_c
hacker@globbing:~$ echo Look: file_[!ab]
Look: file_c
hacker@globbing:~$ echo Look: file_[^ab]
Look: file_c
hacker@globbing:~$ echo Look: file_[ab]
Look: file_a file_b

Вооружившись этим знанием, отправляйтесь в /challenge/files и запустите /challenge/run, передав в качестве аргумента все файлы, имена которых не начинаются на c, t или f.

ПРИМЕЧАНИЕ:. Учтите, что символ ! в bash имеет иное специальное значение, если он не является первым символом внутри шаблона [], поэтому, если поведение внезапно перестаёт быть понятным, проверьте именно это. Символ ^ лишён этого недостатка, однако не поддерживается в более старых версиях оболочки.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Как бы заманчиво ни было использовать *, чтобы сократить объём вводимого в командной строке текста, это легко может привести к ошибкам. Ваш шаблон (glob) может развернуться в нежелательные файлы, и Вы можете заметить это уже тогда, когда обратить последствия нельзя, например, когда команда rm уже давно запущена. От подобных ошибок не застрахован никто.

Более безопасной альтернативой, когда Вы пытаетесь указать конкретную цель, является автодополнение по Tab (tab completion). Если нажать Tab в оболочке, она попытается «догадаться», что именно Вы собираетесь ввести, и автоматически допишет остальное. Автодополнение чрезвычайно полезно, и в данном задании Вы потренируетесь использовать его для указания файлов.


В этом испытании флаг был скопирован в файл /challenge/ctf_school, и Вы можете свободно вызывать cat для этого файла. Но набрать имя этого файла вручную у Вас не получится: мы применили небольшое колдовство, чтобы Вы были вынуждены использовать именно дополнение по Tab.

Попробуйте:

hacker@globbing:~$ ls /challenge
ctf_school
hacker@globbing:~$ cat /challenge/ctf_school
cat: /challenge/ctf_school: No such file or directory
hacker@globbing:~$ cat /challenge/ctf<TAB>
ctf.school{ваш_флаг!}
hacker@globbing:~$

Когда Вы нажимаете клавишу Tab, имя дополняется до полного, и Вы получаете возможность прочитать содержимое файла.
Удачи!

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

В этом задании мы разберёмся, как ведёт себя автодополнение в сложных ситуациях выбора. Например, в такой:

hacker@globbing:~$ ls
flag  flamingo  flowers
hacker@globbing:~$ cat f<TAB>

Здесь у оболочки есть несколько вариантов завершения. Что же произойдёт?

Конкретное поведение зависит от используемой оболочки и её настроек. По умолчанию bash дополняет ввод до первой точки, в которой варианты перестают быть однозначными (в данном случае — до fl). Когда Вы нажимаете Tab второй раз, оболочка выводит все подходящие варианты.

ПРИМЕЧАНИЕ:
Другие оболочки и конфигурации вместо этого могут циклически перебирать возможные варианты завершения.


В этом задании в каталоге /challenge/files находится множество файлов, начинающихся с ctf. Воспользуйтесь дополнением по Tab (начав, например, с /challenge/files/ctf) доберитесь до файла с флагом.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college

Автодополнение по Tab работает не только для имён файлов. Вы также можете дополнять по Tab имена команд.

В этом уровне существует команда, имя которой начинается с run, и при её выполнении Вы получите флаг. Наберите run и нажмите клавишу Tab, чтобы оболочка автоматически дополнила имя команды.

ПРИМЕЧАНИЕ:
Вы можете использовать автодополнение для любой команды, однако будьте осторожны: бездумное нажатие Tab и запуск автоматически дополненной команды, не проверив, что именно получилось, может привести к весьма неприятным последствиям в Вашей оболочке, если по ошибке выполнить не ту команду.

Connect with SSH

Link your SSH key, then connect with: ssh hacker@dojo.pwn.college