Dlaczego „sudo -u root echo„ whoami ”” nie zwraca root?

10

Jak używasz sudo do uruchamiania polecenia jako rzeczywisty użytkownik root na Ubuntu? Początkowo myślałem, że to domyślne zachowanie sudo, dopóki nie uruchomiłem:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Jest to jednak rodzaj zachowania, którego chcę, ale tylko w jednym wierszu:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Cerin
źródło
11
dlaczego echo whoami? Po prostu powiedz sudo whoami .. zwraca root
Neo

Odpowiedzi:

26

W rzeczywistości to nie uruchamiać je jako root. Ale to, co się z tobą dzieje, polega na tym, że tyki są oceniane przed sudo uruchomieniem, ponieważ są one potrzebne do oceny polecenia. Mówiąc wprost, dlaczego nie tylko to:

sudo whoami

Twoje whoamityknięcia z tyłu są w rzeczywistości oceniane w podpowłoce jako bieżący użytkownik, dlatego widzisz, co robisz.

Błąd krytyczny
źródło
2
To jest źle. sudo działa z uprawnieniami roota, ale nie jako root.
Manfred Moser
@Moser, dlaczego więc jego polecenie wypisuje „root”?
Cerin
4
@ManfredMoser: Biegnie z UID 0(zero), która jest dokładnie to, co ludzie nazywają „root”. ( sudo
Miałbyś
1
M. Moser mógł mieć na myśli fakt, że set-UID zmienia jedynie efektywny identyfikator użytkownika procesu, wymagając, aby sam proces zmienił rzeczywisty identyfikator użytkownika, jak zresztą sudorobi. Ale po przeczytaniu odpowiedzi xyr wydaje się, że tak nie jest.
JdeBP
7

whoamiNajpierw wykonywana jest podpowłoka ( ), a wynik ( myuser) jest wstawiany do sudopolecenia; co sudowidzi jest echo myuser. Potraktuj to jako skrót do:

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
źródło
1

Wydaje się, że dzieje się tu coś zaskakującego…

Backticks oczywiście robią to, co wyjaśnili inni, rozwijając się whoamiprzed wywołaniem „sudo” i pozostawiając backticks off zwracają „root”, zgodnie z oczekiwaniami.

Ale warto zrozumieć, co tak naprawdę dzieje się z sudo (8). Więc faktycznie spojrzałem na stronę podręcznika!

„Rzeczywisty i skuteczny identyfikator UID i GID są ustawione tak, aby pasowały do ​​docelowych użytkownika…”

Wygląda więc na to, że obserwowane zachowanie nie ma nic wspólnego z różnicą między efektywnym a rzeczywistym identyfikatorem użytkownika.

Ilustruje to także wykonanie „sudo printenv” i porównanie do samego „printenv”, co mnie trochę zaskoczyło. Pokazuje, że [i] niektóre [/ i] wyeksportowane zmienne są dostępne, a inne nie: zgłasza HOME, ŚCIEŻKA, PS1, SHELL, TERM i EDYTORA wywołującego użytkownika, ale nie inne, takie jak MANPATH, CVSROOT, LD_LIBRARY_PATH lub ENV. Wydaje się to nieco dziwne, ponieważ może powodować, że programy zachowują się inaczej niż jako pierwotny użytkownik lub jako root.

Jan Steinman
źródło
0

sudo pozwala na uruchomienie dowolnej komendy z uprawnieniami administratora, ale nie jako użytkownik root. Jest to przydatne, ponieważ dzięki tej konfiguracji wiele osób może mieć prawa roota, ale wszystkie rejestrowanie itd. Nadal wskazuje, kto dokonał zmian.

Ta konfiguracja jest lepsza niż udostępnianie haseł root. Jako taki zastąpił posiadanie użytkowników root w wielu dystrybucjach, w tym w Ubuntu.

Z drugiej strony sudo su sprawia, że ​​jesteś rootem i dlatego nie powinien być używany.

Ta różnica wyjaśnia również twoje zaobserwowane (prawidłowe) zachowanie.

Manfred Moser
źródło
6
Nie. To, co wyjaśnia zachowanie, jest bardzo prostą kwestią tego, jak działa zastępowanie poleceń w powłoce. Nie ma to nic wspólnego z przywilejami.
JdeBP
-2

Sudo tymczasowo przyznaje kimkolwiek jesteś (pod warunkiem, że możesz sudo w pierwszej kolejności) uprawnienia na poziomie root.

Aby być rootem, musisz zalogować się jako root, który jest domyślnie zablokowany w Ubuntu.

Musisz być ostrożny, sudo nie jest rootem. Jeśli chcesz pokazać, że Fred wykonuje coś w stylu sudo, sprawdź zmienne środowiskowe SUDO, SUDO_COMMAND może być najbardziej użyteczny.

Tony Hopkinson
źródło
Root jest zablokowany w Ubuntu? Jesteś pewien? Wiem, że jest to zniechęcone, ale myślałem, że nieco utrudniają nowicjuszowi faktyczne ustawienie nieznanego hasła przy użyciu identyfikatora UUID, który można zmienić zwykłymi metodami.
Marty Fried