Я использую Debian Stretch. Когда я делаю file /sbin/reboot (или любую связанную с ним команду), он говорит, что он связан с /bin/systemctl без каких-либо параметров, насколько мне известно.

Как systemctl знает, что я хочу перезагрузить компьютер? Проверяет ли argv[0] и есть ли в коде ключ / регистр?

Это также работает, когда я запускаю его в другом месте (например, в ln --symbolic /bin/systemctl ~/bin/reboot ).

1 ответ1

1

Проверяет ли argv[0] и есть ли в коде ключ / регистр?

Изучите код и найдите для себя. Но я уверен, что общий ответ: да, что-то подобное.


Это известный трюк. Возьмите BusyBox в качестве примера. Из Википедии:

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

Bash - это еще один пример. От man bash:

Если bash вызывается с именем sh , он пытается максимально близко имитировать поведение при запуске исторических версий sh , при этом также соответствует стандарту POSIX.

Проверьте /bin/sh в вашем Debian Stretch. Это символическая ссылка на (вероятно)... dash . Этот сайт объясняет:

До Debian Lenny оболочкой по умолчанию /bin/sh была bash . Начиная с Debian Squeeze, оболочкой по умолчанию будет dash .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .