Я на Debian 9. Есть некоторые команды, которые не могут быть найдены, когда я не sudo прямо перед этим. Могу ли я отключить эту функцию?

У меня есть Arch Linux, и у него нет этой функции безопасности. Мой пользователь в группе администраторов.

2 ответа2

4

В 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:~# 
1

Я бы не назвал это функцией безопасности.

Исполняемый файл можно запускать по его единственному имени, если он находится в одном из каталогов, указанных в переменной среды 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 . Реальные функции безопасности включают:

  • права доступа к файлу могут запретить пользователям без полномочий 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 не найдет его.

Тем не менее вкладка 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 (а многие это делают).

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