sudo як інший користувач із оточенням


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Чому його не $HOMEвстановлено, /home/otheruserнавіть якщо bash викликається як оболонка для входу?

Зокрема, /home/otheruser/.bashrcне отримують джерела. Крім того, /home/otheruser/.profileне отримують джерела. - ( /home/otheruser/.bash_profileне існує)

EDIT: Точна проблема - насправді https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails


Вирішення цього питання вирішить і інше питання, ви можете видалити інше питання в цій ситуації.
Павло Шімерда

Відповіді:


83

Для виклику оболонки для входу за допомогою sudoпросто використання -i. Якщо команда не вказана, ви отримаєте підказку оболонки для входу, інакше ви отримаєте результат своєї команди.

Приклад (оболонка входу):

sudo -i

Приклад (із вказаним користувачем):

sudo -i -u user

Приклад (з командою):

sudo -i -u user whoami

Приклад (користувач друку $HOME):

sudo -i -u user echo \$HOME

Примітка. Символ зворотної косої риси забезпечує те, що знак долара досягає оболонки цільового користувача та не інтерпретується в оболонці користувача, що викликає.

Я щойно перевірив останній приклад із напругою, яка точно розповідає вам про те, що відбувається. Висновок нижче показує, що оболонка викликається за допомогою --loginта з вказаною командою так само, як у вашому явному виклику bash, але крім того, sudo може виконувати свою роботу, як встановлення $HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

Я помітив, що ви використовуєте, -Sі не думаю, що це взагалі хороша техніка. Якщо ви хочете запускати команди як інший користувач, не виконуючи автентифікацію з клавіатури, можливо, замість цього потрібно використовувати SSH. Він працює localhostяк для інших хостів, так і забезпечує аутентифікацію відкритого ключа, яка працює без будь-якого інтерактивного введення.

ssh user@localhost echo \$HOME

Примітка: Вам не потрібні спеціальні параметри з SSH, оскільки SSH-сервер завжди створює оболонку входу, до якої може отримати доступ клієнт SSH.


2
sudo -i -u user echo \$HOMEне працює для мене. Вихід: $HOME. strace дає такий же вихід, як і ваш. У чому проблема?
John_West

Не маю ідеї, вона все ще працює для мене, мені потрібно було б її побачити або, можливо, навіть торкнутися системи.
Павло Шімерда

10

Ви даєте Башу занадто багато кредиту. Вся "оболонка входу", що означає Bash, - це те, що файли отримуються при запуску та завершенні роботи. $HOMEЗмінна не фігурує в ній.

Документи Bash детальніше пояснюють, що означає оболонка входу: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

Насправді Баш взагалі нічого не робить $HOME. $HOMEвстановлюється тим, що викликає оболонку (логін, ssh тощо), і оболонка успадковує її. Що б не розпочалося, щоб ваша оболонка була встановлена ​​адміністратором, $HOMEа потім була виконана bash, sudoдизайн не змінює оточення, якщо не буде просити чи налаштовано так, щоб bashдругий користувач успадкував її від вашої оболонки.

Якщо ви хочете sudoобробляти більше навколишнього середовища так, як ви очікуєте, подивіться на -iвимикач sudo. Спробуйте:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Сторінка man для sudo описує його більш докладно, хоча й не дуже добре, я думаю: http://linux.die.net/man/8/sudo


4
$ HOME не встановлений bash - Дякую, я цього не знав.
користувач80551

Шукайте напруги у моїй відповіді. Це показує, що вам не потрібно самостійно будувати /bin/bash -l -c 'echo $HOME'командний рядок під час використання -i.
Павло Шімерда

1
Цей sudoсинтаксис призвів до помилки на моїй машині. ( suвикористовує -cпараметр, але я не думаю, що sudoце робить.) Мені пощастило з:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

так, @palswim має рацію. Не впевнений у -S(мені це не потрібно, тому я його покинув), але -cтут не працює, вам потрібно -s.
polynomial_donut
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.