Команда sudo не является источником /root/.bashrc

27

Я добавил собственный путь к PATHпеременной в моем файле /root/.bashrc

Когда я это делаю sudo su; echo $PATH, он показывает запись '/ path / to / custom / bins'.

Но я делаю sudo sh -c 'echo $PATH', это показывает, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Пути к папкам, добавленные в файл .bashrc, не отображаются.

Разве команда sudo не имеет ту же среду, что и пользователь root?


источник

Ответы:

32

.bashrcэто файл конфигурации bash, только когда он выполняется в интерактивном режиме. Он загружается только при запуске bash, а не при запуске какой-либо другой программы, например sh(даже если bash вызывается через имя sh). И он загружается только тогда, когда bash является интерактивным, а не когда он выполняет скрипт или команду с помощью -c.

sudo sh -c 'echo $PATH'или sudo bash -c 'echo $PATH'не вызывает интерактивную оболочку, поэтому .bashrcне участвует.

sudo su; echo $PATHзапускает интерактивный экземпляр оболочки root. Если это bash, то ~root/.bashrcзагружается. Этот фрагмент кода выполняется echo $PATHпосле завершения работы интерактивной оболочки, поэтому все, что происходит в интерактивной оболочке, не влияет на то, что выводит фрагмент в конце. Но если вы наберете echo $PATHпо приглашению интерактивной оболочки, запущенной с sudo su, вы увидите значение, установленное ~root/.bashrc.

Поскольку .bashrcвызывается в каждой интерактивной оболочке, а не в оболочках входа в систему (даже не в интерактивных оболочках входа в систему, что является дефектом проектирования в bash), это неправильное место для определения переменных среды. Используйте .bashrcдля интерактивных настроек bash, таких как привязки клавиш, псевдонимы и настройки завершения. Установите переменные среды в файлах, которые загружаются при входе в систему: ~/.pam_environmentили ~/.profile.

Так установлено PATHв .profileвместо .bashrc, и либо запустить оболочку входа в систему с sudo -i 'echo $PATH', или в явном виде источника .profileс sudo sh -c '. ~/.profile; echo $PATH'.

Жиль "ТАК - перестань быть злым"
источник
1
обратился ко многим важным вопросам о снарядах .... спасибо ....
1
Как мне его добавить .profile? Вы имеете в виду /root/.profileили /home/user/.profile? Я попытался добавить export PATH=$PATH:/mydirк обоим. Не сработало Я пробовал без export, это тоже не сработало.
falsePockets
@falsePockets Не работает для чего? Вы должны задать новый вопрос и точно объяснить, что вы делаете.
Жиль "ТАК - прекрати быть злым"
То, что не сработало, - это то же самое, что пытается сделать OP. Я пытаюсь добавить каталог в ПУТЬ моего суперпользователя. Я не должен задавать новый вопрос, так как этот вопрос будет дубликатом этого вопроса.
falsePockets
@falsePockets Но, очевидно, вы не делаете то же самое, чтобы получить доступ к учетной записи суперпользователя. И поскольку ты не сказал, что делаешь, я не могу помочь тебе, кроме как повторить то, что уже есть в моем ответе.
Жиль "ТАК - прекрати быть злым"
14

Посмотрите на -Eи -iварианты.

-EУказывает политике безопасности, что пользователь желает сохранить существующие переменные среды. Политика безопасности может возвращать ошибку, если у пользователя нет разрешения на сохранение среды.

-i: Запустите оболочку, указанную в записи базы данных паролей целевого пользователя, в качестве оболочки входа. Это означает, что специфичные для входа файлы ресурсов, такие как .profile или .login, будут читаться оболочкой. Если указана команда, она передается в оболочку для выполнения через опцию -c оболочки. Если команда не указана, выполняется интерактивная оболочка. sudo пытается перейти в домашний каталог этого пользователя перед запуском оболочки. Команда запускается в среде, аналогичной той, которую пользователь получает при входе в систему. В разделе Командная среда в руководстве sudoers (5) описано, как параметр -i влияет на среду, в которой запускается команда, когда политика sudoers имеет значение в использовании.

Vinz
источник
3

Вы могли бы sudo bash, который действительно читает bashфайлы запуска, как документировано в bashстранице руководства / документации. Обратите внимание, однако, что он может HOMEнеправильно установить переменную среды. Это можно исправить в общесистемном bashфайле запуска ( /etcточное расположение зависит от дистрибутива) - проверьте, $uidравно ли 0.

Ned64
источник