Я бы не назвал это функцией безопасности.
Исполняемый файл можно запускать по его единственному имени, если он находится в одном из каталогов, указанных в PATH
переменной среды. В моем Debian 9 файл /etc/profile
определяет базовый, PATH
как это:
if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH
Это означает, что для любого пользователя с UID 0
(в моем Debian только для root
) по умолчанию
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
(каталоги разделены :
) и для любого другого пользователя это
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
Я называю это «по умолчанию», потому что обычно /etc/profile
загружается для любого пользователя, но затем пользователь может изменить свой собственный PATH
. Обычно ~/.profile
это хороший файл для этого.
При запуске sudo some_command
, sudo
использует еще один набор каталогов вместо PATH
. Этот набор может быть или не быть определен где-то в sudo
config ( /etc/sudoers
, /etc/sudoers.d/*
). Если это не определено явно, /etc/sudoers
говорит, что значением по умолчанию является
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
(Это несколько упрощено, другие варианты могут изменить эту механику; см. man 5 sudoers
Подробности).
Обратите внимание, что PATH
для root
и secure_path
используется sudo
содержит несколько названных каталогов sbin
(в разных местах), в то время как PATH
для обычного пользователя нет. В этих каталогах есть инструменты, предназначенные для использования в основном root
.
Поэтому, если sudo some_command
находит исполняемый файл, а подошва some_command
- нет, это потому, что он some_command
находится в одном из каталогов, которые находятся secure_path
в вашем каталоге, но не в нем PATH
.
Но это не функция безопасности. Любой пользователь может добавить все эти sbin
каталоги в свои собственные PATH
, поэтому после ввода some_command
оболочки попытается запустить исполняемый файл. Или они могут использовать полный путь, как /sbin/some_command
. Реальные функции безопасности включают:
- права доступа к файлу могут запретить запускать его пользователям без полномочий root (хотя в Debian 9 многие (все?) системные исполняемые файлы могут запускаться любым пользователем);
- файл запускается, но не может получить доступ к необходимым ресурсам, поэтому выдает ошибку и завершает работу (например
/sbin/hwclock
); - файл запускается и использует некоторый агент аутентификации для повышения разрешений без
sudo
(такой файл, скорее всего, будет помещен в bin
первую очередь, например:) /bin/systemd
; - или файл работает успешно, потому что вы можете запустить его, несмотря на то, что он находится
sbin
(например, /sbin/discover
в моем Debian).
Ваша учетная запись не настроена для работы some_command
без, sudo
потому что, как обычный пользователь, вам это не нужно. Но если вы все-таки хотите его, просто используйте его полный путь и получите его ( whereis some_command
может быть полезно). Заполнение вами PATH
всех этих sbin
каталогов будет только засорять вашу вкладку завершения (например, в Bash).
Завершение вкладки заслуживает некоторого объяснения. Возьмем Bash в качестве примера оболочки с этой функциональностью. Оболочка имеет PATH
в своем окружении, она может читать ее, поэтому если вы наберете another_com
и нажмете tab, она может дать вам подсказку another_command
найти где-то в соответствии с вашим PATH
. Если some_command
где-то внутри sbin
, some_com
tabне найдете его.
Все еще sudo some_com
tabможет найти это. Это может показаться странным, потому что оболочка не может ни знать root
, PATH
ни читать, /etc/sudoers
и тому подобное. Что происходит, оболочка временно добавляет общие sbin
каталоги PATH
только для выполнения этого поиска. Это делается внутри файла /usr/share/bash-completion/completions/sudo
, соответствующая строка
local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
Чтобы ответить на ваш явный вопрос
Могу ли я отключить эту функцию?
Да, вы можете добавить sbin
каталоги в свой PATH
. Это не позволит вам успешно выполнять команды без них sudo
, если они действительно нужны sudo
(а многие это делают).