$ 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
не существует)
bash
sudo
environment-variables
user80551
источник
источник
Ответы:
Для вызова оболочки входа используйте
sudo
только-i
. Когда команда не указана, вы получите приглашение оболочки входа, в противном случае вы получите вывод вашей команды.Пример (оболочка входа):
Пример (с указанным пользователем):
Пример (с командой):
Пример (распечатать пользователя
$HOME
):Примечание. Символ обратной косой черты гарантирует, что знак доллара достигает оболочки целевого пользователя и не интерпретируется в оболочке вызывающего пользователя.
Я только что проверил последний пример с помощью strace, который точно говорит вам, что происходит. Вывод ниже показывает, что оболочка вызывается
--login
с указанной командой и так же, как при явном обращении к bash, но в дополнение sudo может выполнять свою собственную работу, например устанавливать$HOME
.Я заметил, что вы используете,
-S
и я не думаю, что это вообще хорошая техника. Если вы хотите запускать команды от имени другого пользователя без выполнения аутентификации с клавиатуры, вы можете вместо этого использовать SSH. Он работаетlocalhost
как для других хостов, так и обеспечивает аутентификацию с открытым ключом, которая работает без какого-либо интерактивного ввода.Примечание: вам не нужны никакие специальные опции с SSH, так как сервер SSH всегда создает оболочку входа в систему, к которой обращается клиент SSH.
источник
sudo -i -u user echo \$HOME
не работает для меня Выход:$HOME
. Strace выдает тот же результат, что и ваш. В чем проблема?Ты слишком доверяешь Башу. Все «оболочка для входа» означает, что 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. Пытаться:Страница man для sudo описывает это более подробно, хотя, я думаю, не очень хорошо: http://linux.die.net/man/8/sudo
источник
/bin/bash -l -c 'echo $HOME'
командную строку самостоятельно при использовании-i
.sudo
синтаксис выдал ошибку на моей машине. (su
использует-c
опцию, но я не думаю, чтоsudo
делает.) Мне повезло с:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(мне это не нужно, поэтому я оставил это), но-c
здесь не работает, вам нужно-s
вместо этого.