Jakie są różnice między „su”, „sudo -s”, „sudo -i”, „sudo su”?

148

Przeczytałem go już z instrukcji, ale nie widzę różnicy ..

su - zmień ID użytkownika lub zostań superużytkownikiem

sudo -s [command]

Opcja -s(shell) uruchamia powłokę określoną przez zmienną środowiskową SHELL, jeśli jest ustawiona, lub powłokę określoną w passwd (5). Jeśli podano polecenie, jest ono przekazywane do powłoki w celu wykonania. W przeciwnym razie wykonywana jest interaktywna powłoka.

sudo -i zniknij opis w instrukcji

Smile.Hunter
źródło
7
Nie używaj również su userdo logowania z niezaufanych powłok, ale su - user. Zobacz unix.stackexchange.com/q/7013/8250
Lekensteyn
@ Lekensteyn wow, świetny przykład. dzięki za LOL :)
törzsmókus 30.01.2015
1
zawsze pamiętajcie stare przykazanie: na próżno nie będziecie żądać nazwy korzenia!
törzsmókus
Nie mówię, że sudo -ijest źle, ale z pewnością możesz z niego skorzystać, używając tego
Kanion Kolob
Prawie duplikat: askubuntu.com/questions/376199/…
Reinier Post

Odpowiedzi:

118

Główną różnicą między tymi poleceniami jest sposób, w jaki ograniczają dostęp do swoich funkcji.

su (co oznacza „podmień użytkownika” lub „przełącz użytkownika”) - robi dokładnie to, uruchamia kolejną instancję powłoki z uprawnieniami użytkownika docelowego. Aby mieć do tego uprawnienia, prosi o podanie hasła użytkownika docelowego . Aby zostać rootem, musisz znać hasło roota. Jeśli na twoim komputerze jest kilku użytkowników, którzy muszą uruchamiać polecenia jako root, wszyscy muszą znać hasło roota - pamiętaj, że będzie to to samo hasło. Jeśli musisz odwołać uprawnienia administratora od jednego z użytkowników, musisz zmienić hasło roota i przekazać je tylko tym osobom, które muszą zachować dostęp - niechlujny.

sudo (hmm ... co to jest mnemonik? Super-User-DO?) jest zupełnie inny. Wykorzystuje plik konfiguracyjny (/ etc / sudoers), który wyświetla listę użytkowników, którzy mają prawa do określonych działań (uruchamiaj polecenia jako root, itp.) Po wywołaniu pyta o hasło użytkownika, który go uruchomił - aby upewnić się, że osoba na terminal to tak naprawdę ten sam „Joe”, który jest wymieniony w /etc/sudoers. Aby odwołać uprawnienia administratora od osoby, wystarczy edytować plik konfiguracyjny (lub usunąć użytkownika z grupy wymienionej w tej konfiguracji). Powoduje to znacznie czystsze zarządzanie uprawnieniami.

W rezultacie w wielu systemach opartych na Debianie rootużytkownik nie ma ustawionego hasła - tzn. Nie można zalogować się bezpośrednio jako root.

Ponadto, /etc/sudoerspozwala określić dodatkowe opcje - tj użytkownik X jest tylko w stanie uruchomić program, Y itd

Często wykorzystywane sudo sukombinacja działa w następujący sposób: najpierw sudoprosi o swoim hasłem, a jeśli masz prawo do tego, powołuje się na następną komendę ( su) jako super-użytkownika. Ponieważ sujest wywoływany przez root, nie wymaga wprowadzania hasła użytkownika docelowego. Tak więc, sudo supozwala otworzyć skorupę jako inny użytkownik (w tym root), jeśli masz prawo dostępu super-użytkownika o /etc/sudoerspliku.

Siergiej
źródło
2
Nigdy nie widziałem sujako „przełączającego użytkownika”, ale zawsze jako superużytkownik; domyślne zachowanie bez nazwy użytkownika innej osoby (choć ma to sens). Z wikipedii : „Polecenie su, zwane również superużytkownikiem [1] już w 1974 r., Było również nazywane„ użytkownikiem zastępczym ”,„ fałszowaniem użytkownika ”lub„ ustawieniem użytkownika ”, ponieważ umożliwia zmianę konta powiązanego z bieżącym terminal (okno). ”
dr jimbob
5
@dr jimbob: masz rację, ale stwierdzam, że „zmiana użytkownika” lepiej opisuje to, co robi - choć historycznie oznacza „superużytkownik”. Cieszę się również, że artykuł w Wikipedii jest bardzo podobny do mojej odpowiedzi - nigdy wcześniej nie widziałem tego artykułu :)
Sergey
11
Oficjalne znaczenie „su” to „użytkownik zastępczy”. Zobacz: „man su”.
Angel O'Sphere
1
@ AngelO'Sphere: Co ciekawe, strona podręcznika Ubuntu w ogóle nie wspomina o „zastępstwie”. Podręcznik na gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) rzeczywiście mówi „su: Uruchom polecenie z zastępczym identyfikatorem użytkownika i grupy”. Myślę, że gnu.org jest źródłem kanonicznym :)
Siergiej
1
Co sudo su?
Kaz Wolfe
59

sudoumożliwia uruchamianie poleceń na własnym koncie użytkownika z uprawnieniami administratora. suumożliwia zmianę użytkownika, dzięki czemu jesteś zalogowany jako root.

sudo -suruchamia powłokę z uprawnieniami roota. sudo -inabywa również środowisko użytkownika root.

Aby zobaczyć różnicę między sui sudo -s, wykonaj, cd ~a następnie pwdpo każdym z nich. W pierwszym przypadku będziesz w katalogu głównym roota, ponieważ jesteś rootem. W drugim przypadku będziesz w swoim własnym katalogu domowym, ponieważ sam jesteś uprawniony do rootowania.

Jest więcej omówienie dokładnie to pytanie tutaj .

Mike Scott
źródło
20
„jesteś sobą z uprawnieniami roota” tak naprawdę się nie dzieje :) W rzeczywistości nie można być „sobą z uprawnieniami roota” - jesteś rootem albo jesteś sobą. Spróbuj wpisać whoami w obu przypadkach. Fakt, że cd ~wyniki są różne, wynika z braku ustawienia sudo -s zmiennej środowiskowej $ HOME.
Siergiej
1
@Sergey, whoami mówi, że są „root”, ponieważ uruchamiasz cmd „whoami” tak, jakbyś go sudo, więc tymczasowo (na czas trwania tego polecenia) wydajesz się być użytkownikiem root, ale wciąż możesz nie mieć pełnego dostęp do katalogu głównego zgodnie z plikiem sudoers.
Ośmiornica
1
@Octopus: próbowałem powiedzieć, że w Uniksie proces może mieć tylko jeden UID, a ten UID określa uprawnienia do procesu. Nie możesz być „sobą z uprawnieniami roota”, program albo działa z twoim UID, albo z UID roota (0).
Siergiej
5
Jeśli chodzi o „nadal możesz nie mieć pełnego dostępu do katalogu głównego zgodnie z plikiem sudoers”: sudoersplik kontroluje, kto może uruchomić polecenie jako inny użytkownik, ale dzieje się to przed wykonaniem polecenia. Jednak gdy pozwolono ci rozpocząć proces jako, powiedzmy, root, działający proces ma identyfikator użytkownika root i ma pełny dostęp do systemu, sudo nie może tego ograniczyć. Znów jesteś zawsze sobą lub rootem, nie ma „pół-n-pół”. Tak więc, jeśli sudoersplik pozwala na uruchamianie powłoki jako root - uprawnienia w tej powłoce byłyby nie do odróżnienia od „normalnej” powłoki root.
Siergiej
36

Ta odpowiedź jest duplikatem mojej odpowiedzi na duplikacie tego pytania , umieszczonej tutaj na kanonicznej odpowiedzi, aby ludzie mogli ją znaleźć!

Główną różnicą między sudo -ii sudo -sjest:

  • sudo -idaje środowisko root, tzn. twoje ~/.bashrcjest ignorowane.
  • sudo -szapewnia środowisko użytkownika, dzięki czemu ~/.bashrcjest szanowany.

Oto przykład, możesz zobaczyć, że mam lslw moim ~/.bin/katalogu aplikację, do której można uzyskać dostęp, sudo -sale nie można go uzyskać za pomocą sudo -i. Zauważ też, że zachęta Bash zmienia się zgodnie sudo -iz sudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Chociaż sudo -sjest to wygodne, aby zapewnić środowisko, które znasz, zalecamy korzystanie zsudo -i dwóch powodów:

  1. Wizualne przypomnienie, że jesteś w sesji „root”.
  2. Środowisko root jest znacznie mniej podatne na zatrucie złośliwym oprogramowaniem, takim jak nieuczciwa linia .bashrc.
dotancohen
źródło
Zauważyłem, że sudo -s nie przetwarza pliku / etc / profile, ani niczego, co mam w /etc/profile.d/ .. jakiś pomysł dlaczego?
skuteczny
@dotancohen - Co rozumiesz przez sudo -szapewnienie środowiska, które użytkownik zna?
Zmotywowany
@dotancohen - Polecenie sudo -s już zapewnia wizualne wskazówki, więc jestem ciekaw, dlaczego sudo -i jest lepszą opcją.
Zmotywowany
9

su prosi o hasło użytkownika „root”.

sudoprosi o podanie hasła (a także sprawdza, czy możesz uruchamiać polecenia jako root, który jest konfigurowany przez /etc/sudoers- domyślnie wszystkie konta użytkowników należące do grup „admin” lub „sudo” mogą używać sudo).

sudo -suruchamia powłokę jako root, ale nie zmienia katalogu roboczego. sudo -isymuluje logowanie do konta root: Twój katalog roboczy będzie /root, a root .profileitp. będą pozyskiwane jak podczas logowania.

Marius Gedminas
źródło
1
aby uczynić odpowiedź bardziej kompletną: sudo -sjest prawie równa su($ HOME jest inny) i sudo -ijest równasu -
DJCrashdummy
@DJCrashdummy - Dlaczego mówisz prawie równy? Co jest inne
Zmotywowany
2

W Ubuntu lub pokrewnym systemie nie znajduję większego zastosowania suw tradycyjnym sensie superużytkownika. sudoradzi sobie z tą skrzynką znacznie lepiej. Jednak suświetnie nadaje się do zostania innym użytkownikiem w jednorazowych sytuacjach, w których konfiguracja sudoerów byłaby głupia.

Na przykład, jeśli naprawiam system z płyty CD / USB na żywo, często podłączam dysk twardy i inne niezbędne rzeczy chrootdo systemu. W takim przypadku moim pierwszym poleceniem jest ogólnie:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

W ten sposób działam nie jako root, ale jako mój normalny użytkownik, a następnie używam sudoodpowiednio.

Scott Severance
źródło
0
  • su Pyta o hasło roota, zostaje rootem, otwiera interaktywną powłokę bez logowania.
  • su - Pyta o hasło roota, zostaje rootem, otwiera interaktywną powłokę logowania.

  • sudo -s Pyta o hasło, zostaje rootem, otwiera interaktywną powłokę bez logowania.
  • sudo -i Pyta o hasło, zostaje rootem, otwiera interaktywną powłokę logowania.

Najlepszą praktyką jest użycie tych dwóch.


  • sudo suPyta o hasło, staje się rootem na sekundę i działa sujako root`.
  • sudo su -Pyta o hasło, staje się rootem na sekundę i działa su -jako root.

Więc w tym przypadku suużywasz sudoi nie musisz znać faktycznego hasła roota. Wyniki są takie same jak sui su -.

Ravexina
źródło
Jaka jest różnica między powłoką logowania i bez logowania?
Pilot6
1
Inne pytanie?
Ravexina