Команда найдена только при использовании с `sudo` в терминале

465
wailay

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

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

0
Пожалуйста, приведите примеры команд. Sudo является стандартной частью безопасности Linux и существует уже довольно давно. music2myear 6 лет назад 0
Команды, которые требуют повышенных привилегий, конечно же, работают с `sudo`. Это не значит, что их «нельзя найти» без него. Пожалуйста, узнайте, как работать в Debian и его производных в рамках его модели безопасности. Это объяснено на https://help.ubuntu.com/community/RootSudo (Ubuntu основан на Debian). GabrielaGarcia 6 лет назад 0
Я не могу использовать iwconfig и ifconfig без sudo, иначе он скажет, что команда не найдена wailay 6 лет назад 0

2 ответа на вопрос

4
ivanivan

В Debian стандартная $PATHсреда var для пользователя root (или при использовании sudo) содержит каталоги /sbin/and /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
Kamil Maciorowski

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

Исполняемый файл можно запускать по его единственному имени, если он находится в одном из каталогов, указанных в 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. Этот набор может быть или не быть определен где-то в sudoconfig ( /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(а многие это делают).

Причина, по которой я набираю команду без sudo, состоит в том, чтобы убедиться, что они существуют, прежде чем пытаться использовать их с sudo, и сэкономить мне время. Обычно добавляется sbin для пользователя sudoer, или не рекомендуется, потому что это засоряет завершение табуляции. Можете ли вы объяснить, что означает «засорять вашу вкладку»? wailay 6 лет назад 0
@ не знаю, распространено ли это. Под «мусором» я подразумеваю, что завершение вашей вкладки будет показывать вам вещи, которые бесполезны (мусор, суета) в контексте обычных пользователей. Подумайте о многопользовательской среде, где большинство пользователей не имеют доступа к `sudo`. Им не нужны инструменты из `sbin`. Несколько суперпользователей или администраторов являются исключениями, а не основным населением; они должны знать, как настроить их настройку. Если у вас есть причина расширить `PATH`, тогда продолжайте, это ваш` PATH` и ваше удобство в конце концов. Хорошей практикой является сделать это путем редактирования `~ / .profile`, а не` / etc / profile`, даже если вы единственный пользователь. Kamil Maciorowski 6 лет назад 0

Похожие вопросы