На моей виртуальной машине Fedora при работе с моей учетной записью у меня /usr/local/bin
на пути:
[justin@justin-fedora12 ~]$ env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
И так же, когда работает su
:
[justin@justin-fedora12 ~]$ su -
Password:
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin
Однако при запуске через sudo
этот каталог не находится в пути:
[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin
Почему путь будет отличаться при запуске через sudo
?
sudo
сохранение $ PATH?Ответы:
Посмотрите на
/etc/sudoers
. Файл по умолчанию в Fedora (как и в RHEL, а также в Ubuntu и аналогичных) содержит следующую строку:Что гарантирует, что ваш путь чист при запуске исполняемых файлов под sudo. Это помогает защитить от некоторых проблем, отмеченных в этом вопросе . Это также удобно, если у вас нет
/sbin
и/usr/sbin
на вашем собственном пути.источник
/usr/local/bin
эту директиву, я бы увидел ее на своем пути при запуске черезsudo
, правильно?/usr/local/bin
. Большое спасибо за объяснение этого!sudo
например, скрипт в своем~/bin
(или любом другом пути, который вы используете)? Я только что внес изменения - это работает, только подумал, что это может быть оборотной стороной?Команда
su -
выполнит профиль корневого пользователя и примет окружение этого пользователя, включая путь и т. Д.,sudo
Этого не делает.Если вы хотите
sudo
вести себя так,su -
используйте опцию,sudo -i [command
которая будет выполнять профиль пользователяЕсли вы хотите
su -
вести себя такsudo
, не используйте дефис - просто используйтеsu [command]
источник
Вы можете проверить, почему (это отличается), запустив
sudo sudo -V
.Например, в Linux запустите:
Примечание: В MacOS / BSD, просто запустите:
sudo sudo -V
.Приведенный выше список ограничен из-за плагина политики безопасности по умолчанию в некоторых дистрибутивах Linux.
Это дополнительно объясняется в
man sudoers
:В этом случае вы можете изменить это, запустив
sudo visudo
и отредактировав файл конфигурации и изменив свойsecure_path
(добавив дополнительный путь, разделенный:
) или добавив в него своего пользователяexempt_group
(чтобы параметры не влияли на васsecure_path
).Или, чтобы пропустить
PATH
временный пользователь , вы можете запустить:и вы можете проверить это:
Смотрите также: Как сделать
sudo
консерв$PATH
?Другая причина, по которой среда может отличаться
sudo
, заключается в том, чтоenv_reset
в вашемsudoers
файле может быть включена опция . Это заставляет команды выполняться в новой, минимальной среде.Таким образом, вы можете использовать
env_keep
опцию (не рекомендуется из соображений безопасности ), чтобы сохранить переменные окружения вашего пользователя:источник
В большинстве linux вы устанавливаете программы через управление пакетами и регулярно получаете обновления. Если вы устанавливаете что-либо, обходящее управление пакетами, оно будет установлено в / usr / local / bin (например, или ... / sbin, или / opt) и не получит регулярных обновлений.
Поэтому я полагаю, что программы не считаются настолько безопасными и по умолчанию не помещаются в корень PATH.
источник
sudo
исключил бы этот каталог по умолчанию.Я только что попробовал это для себя, и я не видел поведение, которое вы видели - мой путь остался прежним, так что, возможно, ваша конфигурация sudo отличается. Если вы проверите,
man sudoers
то увидите, что есть опция,secure_path
которая перезагружаетсяPATH
- похоже, эта опция была включена.источник
Потому что, когда вы используете
sudo bash
,bash
не действует как оболочка входа в систему. Попробуйте еще раз,sudo bash -l
и вы увидите тот же результат, что иsu -
.Если это верно, то разница в
PATH
ложь в файлах конфигурации:/etc/profile
,~/.bash_profile
,~/.bash_login
,~/.profile
выполняются (в указанном порядке) для входа в оболочку, в то время как~/.bashrc
выполняется для нерегистрированной интерактивной оболочки.источник
Старый вопрос, я знаю, но я наткнулся здесь только сейчас, потому что я исследовал именно эту проблему.
По какой-то причине
/usr/local/bin
был только в PATH при получении root черезsudo su -
. При использованииsudo -i
его там не было. Конечно, теперь я знаю, что могу добавить его в / etc / sudoers, но это все еще не объясняет, почему оно уже тамsu -
. Откуда взялась эта часть PATH?После долгих поисков я нашел ответ:
Путь по умолчанию, содержащий «/ usr / local / bin», фактически жестко запрограммирован в su (1).
Поэтому никакая конфигурация pam, профиль, bashrc или что-либо еще не отвечали за выборочное добавление этого элемента. Он всегда был там, когда
su
вступил во владение. А такsudo
как не вызываетsu
вообще, но использует свою собственную конфигурацию, послеsudo -i
Я нашел это, чтобы быть правдой на RHEL6 и RHEL7. Я не проверял ни одну другую версию или дистрибутив.
источник
su
двоичного файла, изменил ее/usr/local/bin
на что-то другое и вызвал копию. Мой PATH теперь содержит измененную строку ... Хорошие дети и не ленивые системные администраторы, конечно, просто скачайте исходный код и зарегистрируйтесь там. ;-)