$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Dlaczego nie $HOME
jest ustawiony na to, /home/otheruser
że bash jest wywoływany jako powłoka logowania?
W szczególności /home/otheruser/.bashrc
nie jest pozyskiwany. Ponadto /home/otheruser/.profile
nie jest pozyskiwany. - ( /home/otheruser/.bash_profile
nie istnieje)
EDYCJA: Dokładny problem to w rzeczywistości https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails
bash
sudo
environment-variables
użytkownik80551
źródło
źródło
Odpowiedzi:
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):
Przykład (z określonym użytkownikiem):
Przykład (z poleceniem):
Przykład (użytkownik wydruku
$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
.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łalocalhost
zarówno z innymi hostami, jak i zapewnia uwierzytelnianie za pomocą klucza publicznego, które działa bez interaktywnych danych wejściowych.Uwaga: Nie potrzebujesz żadnych specjalnych opcji w SSH, ponieważ serwer SSH zawsze tworzy powłokę logowania, do której ma dostęp klient SSH.
źródło
sudo -i -u user echo \$HOME
nie działa dla mnie Wyjście:$HOME
. strace daje taki sam wynik jak twój. W czym problem?Dajesz Bashowi zbyt dużo kredytu. Wszystkie „powłoki logowania” oznaczają, że Bash pobiera pliki podczas uruchamiania i zamykania systemu.
$HOME
Zmienna 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
.$HOME
jest ustawiany przez cokolwiek, co wywołuje powłokę (login, ssh itp.), a powłoka ją dziedziczy. Cokolwiek uruchomiło powłokę jako zestaw administratora,$HOME
a następnie uruchomionebash
,sudo
z założenia nie zmienia środowiska, chyba że zostanie o to poproszony lub skonfigurowany, takbash
jak inny użytkownik odziedziczył go z powłoki.Jeśli chcesz
sudo
obsługiwać więcej środowiska w oczekiwany sposób, spójrz na-i
przełącznik sudo. Próbować:Strona podręcznika dla sudo opisuje ją bardziej szczegółowo, choć nie za dobrze, jak sądzę: http://linux.die.net/man/8/sudo
źródło
/bin/bash -l -c 'echo $HOME'
wiersza poleceń podczas używania-i
.sudo
składnia spowodowała błąd na moim komputerze. (su
korzysta z-c
opcji, ale nie sądzęsudo
.) Miałem więcej szczęścia z:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
(nie potrzebowałem tego, więc go pominąłem), ale-c
tutaj nie działa,-s
zamiast tego potrzebujesz .