sudo jako inny użytkownik ze swoim środowiskiem

56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Dlaczego nie $HOMEjest ustawiony na to, /home/otheruserże bash jest wywoływany jako powłoka logowania?

W szczególności /home/otheruser/.bashrcnie jest pozyskiwany. Ponadto /home/otheruser/.profilenie jest pozyskiwany. - ( /home/otheruser/.bash_profilenie istnieje)

EDYCJA: Dokładny problem to w rzeczywistości https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails

użytkownik80551
źródło
Rozwiązanie tego pytania rozwiąże również inne pytanie, w tej sytuacji możesz usunąć inne pytanie.
Pavel Šimerda

Odpowiedzi:

83

Aby wywołać powłokę logowania, sudowystarczy 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ą --logini 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 -Si 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 localhostzaró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.

Pavel Šimerda
źródło
2
sudo -i -u user echo \$HOMEnie działa dla mnie Wyjście: $HOME. strace daje taki sam wynik jak twój. W czym problem?
John_West
Nie mam pojęcia, to wciąż działa dla mnie, musiałbym to zobaczyć, a może nawet dotknąć systemu.
Pavel Šimerda,
10

Dajesz Bashowi zbyt dużo kredytu. Wszystkie „powłoki logowania” oznaczają, że Bash pobiera pliki podczas uruchamiania i zamykania systemu. $HOMEZmienna nie figuruje w nim.

Dokumenty Bash wyjaśniają trochę więcej, co oznacza powłoka logowania: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

W rzeczywistości Bash nie robi nic, aby ustawić $HOME. $HOMEjest ustawiany przez cokolwiek, co wywołuje powłokę (login, ssh itp.), a powłoka ją dziedziczy. Cokolwiek uruchomiło powłokę jako zestaw administratora, $HOMEa następnie uruchomione bash, sudoz założenia nie zmienia środowiska, chyba że zostanie o to poproszony lub skonfigurowany, tak bashjak inny użytkownik odziedziczył go z powłoki.

Jeśli chcesz sudoobsługiwać więcej środowiska w oczekiwany sposób, spójrz na -iprzełącznik sudo. Próbować:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Strona podręcznika dla sudo opisuje ją bardziej szczegółowo, choć nie za dobrze, jak sądzę: http://linux.die.net/man/8/sudo

Jeff Snider
źródło
4
$ HOME nie jest ustawione przez bash - Dzięki, nie wiedziałem o tym.
user80551
Poszukaj strace w mojej odpowiedzi. Pokazuje, że nie musisz samodzielnie budować /bin/bash -l -c 'echo $HOME'wiersza poleceń podczas używania -i.
Pavel Šimerda
1
Ta sudoskładnia spowodowała błąd na moim komputerze. ( sukorzysta z -copcji, ale nie sądzę sudo.) Miałem więcej szczęścia z:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim
tak, @palswim ma rację. Nie jestem pewien -S(nie potrzebowałem tego, więc go pominąłem), ale -ctutaj nie działa, -szamiast tego potrzebujesz .
polynomial_donut