'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - kiedy ma to znaczenie, które jest używane, czy w ogóle ma znaczenie?

254

Kiedy robię coś, co wymaga wpisania roota dziesiątki razy z rzędu, wolę przełączyć moją sesję na sesję root. W różnych tutoriali i instrukcji Użyłem w Internecie, widzę sudo su, sudo su -, sudo -ii sudo /bin/bashsą wykorzystywane do otwarcia sesji użytkownika root, ale nie jestem jasne na różnicy między nimi a kiedy i czy to się liczy różnicę.

Czy ktoś może mi to wyjaśnić?

Paweł
źródło
11
Zapomniałeś zapytać o sudo -si sudo su.
Radu Rădeanu
3
@ RaduRădeanu Kiedy wpisałem pytanie, przejrzałem sugerowane pytania i żadne z nich tak naprawdę nie rozwiązało mojego pełnego pytania. To samo dotyczy pytań, z którymi się łączysz. Mimo że zawierają wiele nowych informacji i dziękuję za linkowanie do nich, nie znalazłem ich tak kompletnych, jak zapewnia poniższy chaos odpowiedzi użytkowników, co jest znacznie bardziej zgodne z tym, czego szukałem.
Paul,

Odpowiedzi:

325

Aby to wyjaśnić, musisz wiedzieć, co robią programy:

  • su- Komenda susłuży do przełączania do innego użytkownika ( s czarownica u Ser), ale można również przełączyć się na roota poprzez wywołanie polecenia bez parametru. suprosi o zmianę hasła użytkownika, po wpisaniu hasła, które przełączyłeś do środowiska użytkownika.
  • sudo- sudoma na celu uruchomienie pojedynczej komendy z uprawnieniami roota. Ale w przeciwieństwie do sumonituje o hasło bieżącego użytkownika. Ten użytkownik musi znajdować się w pliku sudoers (lub grupie, która znajduje się w pliku sudoers). Domyślnie Ubuntu „zapamiętuje” twoje hasło przez 15 minut, dzięki czemu nie musisz wpisywać hasła za każdym razem.
  • bash- Interfejs tekstowy do interakcji z komputerem. Ważne jest, aby zrozumieć różnicę między powłokami logowania, bez logowania, interaktywnymi i nieinteraktywnymi:

Rodzaje muszli:

  • Powłoka logowania : Powłoka logowania loguje Cię do systemu jako określony użytkownik, niezbędna do tego jest nazwa użytkownika i hasło. Kiedy naciśniesz ctrl+ alt+, F1aby zalogować się do wirtualnego terminala, otrzymasz po udanym zalogowaniu się powłokę logowania.
  • Powłoka non-login : Powłoka wykonywana bez logowania, niezbędna do tego jest aktualnie zalogowany użytkownik. Kiedy otworzysz terminal graficzny w gnome, jest to powłoka niezalogowana.
  • powłoka interaktywna : powłoka (zaloguj się lub bez logowania), w której można interaktywnie wpisywać lub przerywać polecenia. Na przykład terminal gnome.
  • powłoka nieinteraktywna : (pod) powłoka, która prawdopodobnie jest uruchamiana z zautomatyzowanego procesu. Nie zobaczysz ani danych wejściowych, ani wyjściowych.

Tak więc przypadki to:

  • sudo suPołączenia sudoz poleceniem su. Bash jest nazywany interaktywną powłoką niezalogowaną. Więc bash tylko się wykonuje .bashrc. Możesz zobaczyć, że po przejściu na root nadal jesteś w tym samym katalogu:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -Tym razem jest to powłoka logowania, tak /etc/profile, .profilei .bashrcsą realizowane i znajdą się w katalogu domowym roota ze środowiskiem roota.

  • sudo -iJest prawie taki sam jak sudo su -opcja -i (symuluj początkowe logowanie) uruchamia powłokę określoną przez wpis bazy danych haseł użytkownika docelowego jako powłokę logowania. Oznacza to, że pliki zasobów specyficzne dla logowania, takie jak .profile, .bashrclub .loginzostaną odczytane i wykonane przez powłokę.

  • sudo /bin/bashOznacza to, że dzwonisz sudoza pomocą polecenia /bin/bash. /bin/bashjest uruchamiany jako powłoka niezalogowana, więc wszystkie pliki kropek nie są wykonywane, ale sam bash czyta .bashrcwywołującego użytkownika. Twoje środowisko pozostaje takie samo. Twój dom nie będzie domem roota. Jesteś więc rootem, ale w środowisku dzwoniącego użytkownika.

  • sudo -sodczytuje $SHELLzmienną i wykonuje treść. Jeśli $SHELLzawiera /bin/bash, wywołuje sudo /bin/bash(patrz wyżej).

Czek:

Aby sprawdzić, czy jesteś w powłoce logowania, czy nie (działa tylko w bash, ponieważ shoptjest to wbudowane polecenie):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
chaos
źródło
18
Tylko wyjaśnienie: sudopozwala uprawnionemu użytkownikowi wykonać polecenie jako administrator lub inny użytkownik . W każdym razie +1 za twój wysiłek.
Radu Rădeanu
2
@chaos Dziękujemy za tę doskonałą odpowiedź! Przeważnie odpowiada na moje pytania, więc poszedłem naprzód i zaznaczyłem odpowiedź na pytanie, ale nie rozumiem, kiedy pożądane jest uruchomienie określonej powłoki. Naprawdę używam Ubuntu tylko za pomocą wiersza poleceń i uważam, że najczęściej używam do otwierania rootsesji użytkownika (w porównaniu do używania sudo), gdy robię coś, co wymaga dużego użycia rootuprawnień, na przykład podczas instalowania czegoś nowego lub przeprowadzania poważnej rekonfiguracji . Używam sudo /bin/bash, ale najwyraźniej ta metoda ma zły rap z jakiegoś powodu, którego nie rozumiem.
Paul
2
Ponadto bardziej „poprawne” jest stwierdzenie, że su oznacza użytkownika przełączającego, a nie superużytkownika. Czyli uruchom skrypt php: su www-data /usr/share/script.php lub po prostu su www-data dla interaktywnej powłoki. Ale su bez nazwy użytkownika przejmie konto root (superużytkownik).
oblivian
Chaos - „shopt -q login_shell && echo„ Powłoka logowania ”|| echo„ Brak powłoki logowania ”„ Tego rodzaju sugestie często widzę, ale dlaczego tak długo to trwa? Operator && oznacza, że ​​jeśli kod wyjścia 0 to „wykonaj następne polecenie”, a podwójne potoki (||) oznaczają inne (jeśli nie 0), to wykonaj to polecenie. Co to w zasadzie mówi, jeśli kod wyjścia 0 to echo „Powłoki logowania”, jeśli kod wyjścia 1 (błąd), to echo „Brak logowania”. Dlaczego nie tylko „shopt -q login_shell; echo $?” $? oznacza kod wynikowy / wyjściowy poprzedniego polecenia. W większości, jeśli nie wszystkie programy 0 oznaczają sukces, 1 lub więcej oznacza niepowodzenie. Więc jeśli echo to 0 = sukces ...
oblivian
2
@Paul: sudo -ijest zalecane. Przeczytaj tutaj: ubuntuforums.org/showthread.php?t=1817402 i tutaj: unix.stackexchange.com/questions/98531/...
Marco Sulla
0

Aby szukać różnic, możesz podzielić środowisko wynikowe między różne wywołania.

Można znaleźć pewne „małe” różnice w niektórych zmiennych krytycznych:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

lub pewna różnica w ~ /. Obsługa plików dotfiles ( ~/.config).

Weź również pod uwagę własność plików logów $ HOME ( ~/.xsession.errorsitp.) Lub xauth cookies ( ~/.Xauthority) generowanych przez polecenia.

Wypróbuj następujące polecenia:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)


hute37
źródło