Aby wywołać powłokę logowania, sudo
wystarczy użyć -i
. Jeśli polecenie nie zostanie określone, pojawi się monit powłoki logowania, w przeciwnym razie otrzymasz wynik polecenia.
Przykład (powłoka logowania):
sudo -i
Przykład (z określonym użytkownikiem):
sudo -i -u user
Przykład (z poleceniem):
sudo -i -u user whoami
Przykład (użytkownik wydruku $HOME
):
sudo -i -u user echo \$HOME
Uwaga: Znak ukośnika odwrotnego zapewnia, że znak dolara dociera do powłoki użytkownika docelowego i nie jest interpretowany w powłoce użytkownika wywołującego.
Właśnie sprawdziłem ostatni przykład za pomocą strace, który dokładnie mówi, co się dzieje. Poniższy wynik pokazuje, że powłoka jest wywoływana za pomocą --login
i za pomocą podanego polecenia, tak jak w twoim jawnym wywołaniu bash, ale dodatkowo sudo może wykonywać swoją własną pracę jak ustawianie $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
...
Zauważyłem, że używasz -S
i nie sądzę, że jest to ogólnie dobra technika. Jeśli chcesz uruchamiać polecenia jako inny użytkownik bez przeprowadzania uwierzytelnienia z klawiatury, możesz zamiast tego użyć SSH. Działa localhost
zarówno z innymi hostami, jak i zapewnia uwierzytelnianie za pomocą klucza publicznego, które działa bez interaktywnych danych wejściowych.
ssh user@localhost echo \$HOME
Uwaga: Nie potrzebujesz żadnych specjalnych opcji w SSH, ponieważ serwer SSH zawsze tworzy powłokę logowania, do której ma dostęp klient SSH.