Я на Debian 9. Есть некоторые команды, которые не могут быть найдены, когда я не sudo
прямо перед этим. Могу ли я отключить эту функцию?
У меня есть Arch Linux, и у него нет этой функции безопасности. Мой пользователь в группе администраторов.
Я на Debian 9. Есть некоторые команды, которые не могут быть найдены, когда я не sudo
прямо перед этим. Могу ли я отключить эту функцию?
У меня есть Arch Linux, и у него нет этой функции безопасности. Мой пользователь в группе администраторов.
В Debian стандартная $PATH
. var для пользователя root (или при использовании sudo
) содержит каталоги /sbin/
и /usr/sbin/
и /usr/local/sbin/
, тогда как пользователь без полномочий root (даже в группе sudo
и т. д.) не имеет эти каталоги в $PATH
по умолчанию.
user@LM193:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
user@LM193:~$ sudo -i
[sudo] password for user:
root@LM193:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@LM193:~#
Я бы не назвал это функцией безопасности.
Исполняемый файл можно запускать по его единственному имени, если он находится в одном из каталогов, указанных в переменной среды 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
(/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
. Реальные функции безопасности включают:
/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
не найдет его.
Тем не менее вкладка sudo some_com
может найти его. Это может показаться странным, потому что оболочка не может знать 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
(а многие это делают).