Если Вы пользуетесь Linux (или вообще компьютерами) достаточно долго и для реальных задач, Вы рано или поздно столкнётесь с такой ситуацией: нужно, чтобы два разных приложения обращались к одним и тем же данным, но при этом каждая программа ожидает увидеть эти данные в своём, «собственном» месте. К счастью, в Linux есть решение этой проблемы — ссылки (links).
Ссылки бывают двух видов: жёсткие (hard) и мягкие (soft, или символические).
Разницу между ними удобно пояснить на такой аналогии:
- Жёсткая ссылка — это когда к Вашей квартире ведут несколько разных адресов, но все они указывают прямо на одно и то же место (например,
Кв. 2 и Дверь 2).
- Мягкая (символическая) ссылка — это когда Вы переехали, а почта автоматически перенаправляет Ваши письма со старого адреса на новый.
В файловой системе файл — это, по сути, адрес, по которому хранится его содержимое.
Жёсткая ссылка — это альтернативный адрес, указывающий на те же самые данные: доступ через жёсткую ссылку и через исходное имя файла полностью идентичен и сразу приводит к нужному содержимому.
Символическая (soft) ссылка, напротив, содержит имя исходного файла. Когда Вы обращаетесь к символической ссылке, Linux понимает, что это именно ссылка, считывает первоначальное имя и затем (обычно автоматически) обращается уже к этому файлу.
На практике в обоих случаях Вы, как правило, получаете доступ к одним и тем же данным, но механизм работы различается.
Жёсткие ссылки по описанию кажутся проще (можно уложился в одно предложение, тогда как для soft‑ссылок понадобится минимум два), но у них есть свои недостатки и особенности реализации, из‑за которых гораздо более распространённым вариантом стали именно мягкие/символические ссылки.
В этом задании мы познакомимся с символическими ссылками (также называемыми symlink). Символические ссылки создаются командой ln с аргументом -s (soft), например:
hacker@cmd:~$ cat /tmp/myfile
Это мой файл!
hacker@cmd:~$ ln -s /tmp/myfile /home/hacker/ourfile
hacker@cmd:~$ cat ~/ourfile
Это мой файл!
hacker@cmd:~$
Вы видите, что при обращении к symlink Вы получаете содержимое исходного файла. Здесь также показано использование ln -s: обратите внимание, что путь к исходному файлу указывается ПЕРЕД путём к создаваемой ссылке!
Определить, что перед Вами именно символическая ссылка, можно несколькими способами. Например, команда file, которая принимает имя файла и сообщает его тип, умеет распознавать symlink:
hacker@cmd:~$ file /tmp/myfile
/tmp/myfile: ASCII text
hacker@cmd:~$ file ~/ourfile
/home/hacker/ourfile: symbolic link to /tmp/myfile
hacker@cmd:~$
Теперь попробуйте сами!
В этом задании флаг, как обычно, находится в /flag, но программа /challenge/run вместо этого читает /home/hacker/not-the-flag. Воспользуйтесь символической ссылкой и обманите её, чтобы она выдала Вам настоящий флаг!