Тайна вызова Less в Linux утилитах

Привет ребят. Ща покопаемся в неочевидных вещах, залезем так сказать под капот.

Знаешь же такую команду:

git log

Тут всё просто, она выводит историю коммитов. И что примечательно, в конце будет пагинация (pager):

А теперь пойдем неочевидной дорожкой и выполним:

sudo mv /usr/bin/less /usr/bin/less.bak 

Ну и снова запустим git log:

Хуяк и нет больше пагинации. Сразу вывалилась простыня. О чем это говорит? А говорит это о том, что git использует внешнюю утилиту less при выводе истории коммитов, причем делает это по умолчанию.

 читать первым в телеграм    читать первым в макс

Но если less накрылся пиздой, git сразу вывалит простыню без пагинации. Забавно!

Давай подключим strace и подтвердим этот факт, запускаем:

strace -f -e execve git log

И видим картину маслом:

Ага, запускается less, а теперь снова перемещаем less и смотрим выхлоп strace:

Вот и прекрасно, словили ошибку error: cannot run less: No such file or directory. Но ожидаемый результат все равно получили.

Если выполнить команду echo $PAGER, то увидим, какая утилита будет использоваться для пагинации. По умолчанию less, но раз есть переменная, её можно переопределить. Давай попробуем это сделать.

apt install lolcat
export PAGER="lolcat"
git log

Иииии ебать копать:

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Кстати не только git завязан на переменную $PAGER, такое же поведение ты можешь увидеть у утилит: man, systemctl, journalctl и т.п. Всё что работает с пагинацией, использует переменную $PAGER.

Ну и на закуску:

export PAGER="vim -"
man ls

Команда man ls будет выполнена в vim. То есть получается что любая программа, доверяющая $PAGER, фактически запускает произвольную команду пользователя.

А это уже еще один вектор атаки из арсенала пентестеров, о котором никто не рассказывает. Так что бери на вооружение, глядишь сгодится при прохождении очередного HackBox’а.

Комментарии