Для виклику оболонки для входу за допомогою 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.