Команда 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?

sudo  bashrc 

Відповіді:


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/.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 Ні для чого не працював? Вам слід задати нове запитання та пояснити, що саме ви робите.
Жил "ТАК - перестань бути злим"

Те, що не спрацювало, - це саме те, що намагається зробити ОП. Я намагаюся додати каталог до PATH мого суперпользователя. Я не повинен задавати нове запитання, оскільки це питання було б дублікатом цього питання.
falsePockets

@falsePockets Але, очевидно, ви не робите те саме, щоб дістатися до облікового запису суперпользователя. А оскільки ви не сказали, що робите, я не можу вам допомогти, крім повторення того, що вже є у моїй відповіді.
Жил "ТАК - перестань бути злим"

14

Подивіться на варіанти -Eта -iваріанти.

-E: Позначає політиці безпеки, що користувач бажає зберегти існуючі змінні середовища. Політика безпеки може повернути помилку, якщо користувач не має дозволу на збереження навколишнього середовища.

-i: Запустіть оболонку, вказану вводом бази даних пароля цільового користувача, як оболонку для входу. Це означає, що оболонки зчитуються специфічними для входу файлами ресурсів, такими як .profile або .login. Якщо вказана команда, вона передається в оболонку для виконання через опцію -c оболонки. Якщо команда не вказана, виконується інтерактивна оболонка. sudo намагається змінити домашній каталог цього користувача перед запуском оболонки. Команда виконується із середовищем, подібним до того, яке отримував би користувач під час входу. Розділ "Середовище команд" у ручному документі "Судоерс" (5) документує, як опція -i впливає на середовище, в якому виконується команда, коли політика sudoers в вживанні.


3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.