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не существует)

user80551
источник
Решение этого вопроса решит и другой вопрос, вы можете удалить другой вопрос в этой ситуации.
Павел Шимерда

Ответы:

83

Для вызова оболочки входа используйте sudoтолько -i. Когда команда не указана, вы получите приглашение оболочки входа, в противном случае вы получите вывод вашей команды.

Пример (оболочка входа):

sudo -i

Пример (с указанным пользователем):

sudo -i -u user

Пример (с командой):

sudo -i -u user whoami

Пример (распечатать пользователя $HOME):

sudo -i -u user echo \$HOME

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

Я только что проверил последний пример с помощью strace, который точно говорит вам, что происходит. Вывод ниже показывает, что оболочка вызывается --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
Понятия не имею, это все еще работает для меня, я должен был бы видеть это или возможно даже коснуться системы.
Павел Šimerda
10

Ты слишком доверяешь Башу. Все «оболочка для входа» означает, что Bash - это файлы, получаемые при запуске и завершении работы. $HOMEПеременная не фигурирует в ней.

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

На самом деле, Bash вообще ничего не делает для установки $HOME. $HOMEустанавливается тем, что вызывает оболочку (login, ssh и т. д.), и оболочка наследует ее. Все , что начал свою оболочку как набор администратора , $HOMEа затем ехес- е изд bash, sudoдизайн не изменяет окружающую среду , если нет или настроен сделать это, так что, bashкак otheruser унаследовал его от оболочки.

Если вы хотите 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 - спасибо, я этого не знал.
user80551
Ищите strace в моем ответе. Это показывает, что вам не нужно создавать /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