Dzięki su
stajesz się innym użytkownikiem - domyślnie rootem, ale potencjalnie innym użytkownikiem. Jeśli powiesz su -
, twoje środowisko zostanie również zastąpione środowiskiem logowania tego użytkownika, dzięki czemu to, co widzisz, jest nie do odróżnienia od zalogowania się jako ten użytkownik. W żaden sposób system nie może powiedzieć, co robisz, gdy jesteś su
zalogowany do innego użytkownika na podstawie działań tego użytkownika.
Zupełnie inaczej jest z sudo
:
Polecenia, które sudo
wykonujesz, wykonują się jako użytkownik docelowy - domyślnie root, ale można je zmieniać -u
- ale rejestruje polecenia, które wykonujesz , oznaczając je swoją nazwą użytkownika, aby można było później przypisać winę. :)
sudo
jest bardzo elastyczny. Możesz na przykład ograniczyć polecenia, które może wykonywać dany użytkownik lub grupa użytkowników. Z su
, wszystko albo nic.
Ta funkcja jest zwykle używana do definiowania ról. Na przykład można zdefiniować grupę „kopii zapasowych”, która może być uruchamiana, dump
i tar
każda z nich wymaga dostępu do konta root, aby poprawnie wykonać kopię zapasową dysku systemowego.
Wspominam o tym tutaj, ponieważ oznacza to, że możesz dać komuś sudo
przywileje, nie dając im sudo -s
ani sudo bash
umiejętności. Mają tylko uprawnienia, których potrzebują, aby wykonywać swoją pracę, a wraz z su
nimi działają cały system. Musisz jednak zachować ostrożność: jeśli dasz komuś zdolność do powiedzenia sudo vi
, na przykład, może on wystrzelić vi
i mieć efektywnie taką samą moc jak z sudo -s
.
Ponieważ pobiera hasło sudoera zamiast hasła roota, sudo
izoluje uprawnienia między wieloma sudoerami.
To rozwiązuje problem administracyjny su
, który polega na tym, że kiedy zmienia się hasło roota, wszyscy ci, którzy musieli go znać, su
musieli zostać poinformowani. sudo
umożliwia niezależne zmienianie haseł sudoers. W rzeczywistości powszechne jest blokowanie hasłem konta użytkownika root w systemie w sudo
celu wymuszenia wykonania wszystkich zadań sysadmin przez sudo
. W dużej organizacji z wieloma zaufanymi sudoerami oznacza to, że kiedy jeden z sysadminów odejdzie, nie musisz zmieniać hasła roota i przekazywać go pozostałym administratorom.
Główna różnica między sudo bash
i sudo -s
polega na tym, że -s
jest krótsza i pozwala na przekazywanie poleceń do wykonania w domyślnej powłoce użytkownika na kilka sposobów:
Możesz powiedzieć, sudo -s some-command
który działa some-command
pod twoją powłoką. Zasadniczo jest to skrót sudo $SHELL -c some-command
.
Zamiast tego możesz przekazać polecenia do standardowego wejścia powłoki, np sudo -s < my-shell-script
. Możesz użyć tego z heredoc, aby wysłać kilka poleceń do jednego sudo
wywołania, unikając konieczności sudo
wielokrotnego pisania .
Oba te zachowania są opcjonalne. O wiele częściej dajesz -s
sam, więc po prostu uruchamia interaktywnie powłokę użytkownika. W tym trybie różni się sudo bash
tym, że może uruchamiać inną powłokę niż bash
, ponieważ najpierw wygląda w SHELL
zmiennej środowiskowej, a następnie, jeśli nie jest ustawiona, w ustawieniach powłoki logowania użytkownika, zwykle w /etc/passwd
.
Powłoka uruchamiana przez sudo -s
dziedziczy twoje aktualne środowisko użytkownika. Jeśli to, czego naprawdę chcesz, to czyste środowisko, takie jak dostajesz zaraz po zalogowaniu, zamiast tego chcesz sudo -i
, to stosunkowo nowy dodatek sudo
. Z grubsza mówiąc, sudo -i
jest sudo -s
tak, jak su -
jest su
: resetuje wszystkie oprócz kilku kluczowych zmiennych środowiskowych i odsyła cię z powrotem do katalogu domowego użytkownika. Jeśli nie wydasz komendy, aby działała pod tą powłoką przez standardowe wejście lub sudo -i some-command
uruchomi tę powłokę jako interaktywną powłokę logowania, aby skrypty startowe użytkownika (np. .bash_profile
) Zostały uruchomione ponownie.
Wszystko to czyni sudo -i
znacznie bezpieczniejszym niż sudo -s
. Dlaczego? Ponieważ jeśli ktoś może wcześniej zmodyfikować twoje środowisko sudo -s
, może spowodować wykonanie niezamierzonych poleceń. Najbardziej oczywistym przypadkiem jest modyfikacja SHELL
, ale może się to również zdarzyć mniej bezpośrednio, na przykład przez, PAGER
jeśli powiesz, man foo
gdy jesteś pod sudo -s
.
Możesz powiedzieć: „Jeśli mogą modyfikować PAGER
, mogą modyfikować PATH
, a następnie mogą po prostu zastąpić zły sudo
program”, ale ktoś wystarczająco paranoiczny może powiedzieć, /usr/bin/sudo /bin/bash
aby uniknąć tej pułapki. Prawdopodobnie nie jesteś tak paranoikiem, że unikniesz pułapek we wszystkich innych podatnych zmiennych środowiskowych. Czy pamiętasz również, aby sprawdzić EDITOR
na przykład przed uruchomieniem jakiegokolwiek polecenia VCS ? W ten sposób sudo -i
.
Ponieważ sudo -i
zmienia również katalog roboczy na katalog domowy użytkownika, możesz nadal chcieć używać sudo -s
w sytuacjach, w których wiesz, że chcesz pozostać w tym samym katalogu, cd
w którym byłeś podczas uruchamiania sudo
. Jednak nadal jest bezpieczniej tam sudo -i
iz cd
powrotem.
sudo su -
ten sposób nie potrzebujesz hasła roota, a-
upewnia się, że katalog domowy jest ustawiony poprawnie.