Для вызова оболочки входа используйте 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.