Polecenie su: różnica między su i su -, sudo su i sudo -i oraz jak przełączyć konto
Aby w Linuksie uruchamiać polecenia z innego konta bez wylogowania się z bieżącego, użyj polecenia su. Przy porównaniu, w którym su uruchomiono z konta root na serwerze AlmaLinux 9 do daemon, konta systemowego bez możliwości logowania, jeden łącznik zmienił folder roboczy i PATH, a polecenie ruszyło dopiero po wskazaniu powłoki.
Poniższe wyniki pochodzą z serwera AlmaLinux 9.8 (konto root) i serwera Debian 12 (zwykłe konto). Ekranów z pytaniem o hasło i sudo nie uruchamiano na serwerze produkcyjnym, lecz opisano je na podstawie oficjalnych podręczników, a część wartości PATH i numer wersji poprawki util-linux w symulatorze zamieniono na wartości przykładowe.
1️⃣ Jak używać polecenia su
Podstawowa postać to [su nazwa_konta], a jeśli pominiesz nazwę konta, su przełącza na root. Gdy wpiszesz exit w nowej powłoce, ta powłoka się kończy i wracasz do powłoki pierwotnego konta, które uruchomiło su.
Przy uruchomieniu ze zwykłego konta w wierszu Password: wpisujesz hasło konta docelowego (według domyślnych ustawień PAM). Na tym serwerze /etc/pam.d/su pomija uwierzytelnianie, gdy uruchamia je root, dlatego przy przełączaniu z konta root na daemon hasło nie było potrzebne.
su --help
Usage:
su [options] [-] [<user> [<argument>...]]
Change the effective user ID and group ID to that of <user>.
A mere - implies -l. If <user> is not given, root is assumed.
Options:
-m, -p, --preserve-environment do not reset environment variables
-w, --whitelist-environment <list> don't reset specified variables
-g, --group <group> specify the primary group
-G, --supp-group <group> specify a supplemental group
-, -l, --login make the shell a login shell
-c, --command <command> pass a single command to the shell with -c
--session-command <command> pass a single command to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh)
-s, --shell <shell> run <shell> if /etc/shells allows it
-P, --pty create a new pseudo-terminal
-h, --help display this help
-V, --version display version
For more details see su(1).Jak podaje pomoc, łącznik [-] to opcja logowania, taka sama jak [-l], a argumenty zapisane po nazwie konta trafiają do powłoki konta docelowego. Na serwerze AlmaLinux 9 su pochodziło z pakietu util-linux 2.37, a na serwerze Debian 12 z pakietu 2.38.
su --versionsu from util-linux 2.38.1Czy konto, na które chcesz się przełączyć, może otworzyć powłokę, widać w ostatnim polu jego wiersza z getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinPowłoką daemon było /sbin/nologin. Konto, które ma nologin zamiast powłoki logowania, nie otwiera powłoki nawet po przełączeniu przez su.
2️⃣ Różnica między su i su -
Z łącznikiem (-) su otwiera taką samą powłokę jak przy zalogowaniu na konto docelowe. W folderze /tmp to samo polecenie uruchomiono raz bez łącznika i raz z łącznikiem.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinBez łącznika folderem roboczym pozostał /tmp, a [su -] przeszło do folderu domowego daemon, czyli /sbin. Na tym serwerze /sbin jest dowiązaniem do /usr/sbin, dlatego pwd pokazało /usr/sbin.
Ze zmiennych środowiskowych porównano tylko pięć wierszy wyniku env: HOME, USER, SHELL, PATH i LOGNAME.
su -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binsu - -s /bin/sh -c env daemon | grep -E '^(HOME|USER|SHELL|PATH|LOGNAME)='SHELL=/bin/sh
LOGNAME=daemon
HOME=/sbin
USER=daemon
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinHOME, USER i LOGNAME w obu przypadkach przyjęły wartości daemon. Bez łącznika PATH zachowało wartość root, który uruchomił su, a w [su -] zostało ustawione na nowo według ustawień logowania.
Według oficjalnego podręcznika su bez łącznika zmienia tylko HOME i SHELL, a USER i LOGNAME zmienia tylko wtedy, gdy konto docelowe nie jest root. Dlatego po przełączeniu ze zwykłego konta na root bez łącznika w USER zostaje nazwa pierwotnego konta.
Inne było też [$0], które wypisuje nazwę powłoki.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shW [su -] przed nazwą powłoki pojawił się łącznik i wyświetliło się -sh. Powłoka, której nazwa zaczyna się od łącznika, działa jako powłoka logowania i czyta pliki konfiguracji logowania (według oficjalnego podręcznika). Różnice między obiema postaciami są poniżej.
| Porównanie | su | su - |
|---|---|---|
| Folder roboczy | Bez zmian (/tmp) | Folder domowy konta docelowego (/usr/sbin) |
| HOME, USER, LOGNAME | Wartość daemon | Wartość daemon |
| PATH | Wartość root, który uruchomił su | Ustawiane na nowo przez ustawienia logowania |
| Nazwa powłoki ($0) | sh | -sh (powłoka logowania) |
| Pozostałe zmienne środowiskowe | Zostają bez zmian | Usuwane poza kilkoma, np. TERM (według oficjalnego podręcznika) |
Oficjalny podręcznik zaleca, aby zawsze dodawać opcję logowania, żeby środowiska się nie mieszały, i pisać [--login] zamiast łącznika. su bez łącznika zachowuje bieżący folder i PATH, więc gdy chcesz sprawdzić polecenie z ustawieniami innego konta, wynik może się różnić od [su -].
3️⃣ Opcje su -c i su -s
Aby uruchomić tylko jedno polecenie z innego konta bez otwierania powłoki, wpisz polecenie po -c. Po uruchomieniu id przez [su -c] na koncie z nologin zamiast wyniku polecenia pojawił się komunikat odmowy.
su -c id daemonThis account is currently not available.Polecenie przekazane przez -c także odbiera i wykonuje powłoka konta, więc jeśli powłoką jest nologin, polecenie nigdy nie zostaje wykonane. Wtedy wskaż przez -s powłokę do uruchomienia.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)Po wskazaniu /bin/sh id uruchomiło się z UID 2 konta daemon. Tej postaci używasz, gdy chcesz sprawdzić uprawnienia plików lub wyniki poleceń z konta usługi.
Jeśli powłoka konta docelowego jest powłoką ograniczoną, której nie ma w /etc/shells, jak nologin, zmienić ją przez -s może tylko root. Według oficjalnego podręcznika -s i zmienna SHELL podane przez użytkownika innego niż root są wtedy ignorowane.
Jeśli polecenie po -c zawiera spacje, ujmij je w cudzysłów, aby przekazać je jako jedną całość. su zwraca kod wyjścia wykonanego polecenia bez zmian, 126, gdy nie udało się go uruchomić, i 127, gdy go nie znaleziono (według oficjalnego podręcznika).
📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| - | Otwiera taką samą powłokę jak przy logowaniu na konto docelowe i przechodzi do jego folderu domowego | W /tmp pwd bez łącznika dało /tmp, a z łącznikiem /usr/sbin, a echo $0 dało -sh | |
| -c polecenie | Uruchamia jedno polecenie w powłoce konta docelowego bez otwierania powłoki | Po uruchomieniu su -c id daemon na koncie z nologin daemon pojawiło się [This account is currently not available.] | |
| -s powłoka | Uruchamia wskazaną powłokę zamiast zapisanej w koncie; dla kont z powłoką ograniczoną tylko root | su -s /bin/sh -c id daemon dało uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Wyświetla sposób użycia i listę opcji | Wiersz Usage i lista opcji -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Wypisuje informacje o wersji | su from util-linux 2.38.1 na serwerze Debian 12 |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| -l | Opcja logowania taka sama jak łącznik (-); długa nazwa --login | |
| -m | Zostawia zmienne środowiskowe i nie zmienia HOME, SHELL, USER ani LOGNAME; ignorowana razem z opcją logowania (tak samo jak -p) | |
| -w lista | Zachowuje zmienne wpisane po przecinku, gdy opcja logowania czyści środowisko; HOME, SHELL, USER, LOGNAME i PATH są ustawiane na nowo | |
| -g grupa | Wskazuje grupę podstawową; tylko root | |
| -G grupa | Wskazuje grupy dodatkowe; tylko root; bez -g pierwsza grupa dodatkowa staje się grupą podstawową | |
| -f | Przekazuje -f do powłoki; opcja używana w csh i tcsh | |
| -P | Tworzy nowy pseudoterminal, aby nie dzielić terminala z pierwotną sesją | |
| --session-command polecenie | Tak samo jak -c, ale bez tworzenia nowej sesji; podręcznik tego nie zaleca |
🔲 Symulator polecenia su
Poniższy symulator startuje ze zwykłego konta user1 i możesz w nim wpisać su, [su -] i sudo, a potem wrócić przez exit. Konta i hasła to wartości przykładowe.
4️⃣ Różnica między sudo su i sudo -i
sudo su to uruchomienie su z uprawnieniami root przez sudo. Ponieważ su uruchamia root, hasło root nie jest potrzebne, a wcześniej sudo pyta o hasło osoby, która je uruchamia (według oficjalnej dokumentacji).
To, które konta mogą uruchamiać sudo, określa konfiguracja /etc/sudoers. Gdy konto bez uprawnień uruchomi sudo, zostaje odrzucone komunikatem [user1 is not in the sudoers file.] (według komunikatu w programie).
Dla każdego polecenia otwierającego powłokę root poniżej widać hasło, o które pyta, i folder roboczy. Poleceń z tej części nie uruchamiano na serwerze produkcyjnym, lecz opisano je na podstawie podręczników su(1) i sudo(8).
| Polecenie | Hasło, o które pyta | Uruchamiana powłoka | Folder roboczy |
|---|---|---|---|
| su | root | Powłoka root | bez zmian |
| su - | root | Powłoka logowania root | /root |
| sudo su | Konto, które uruchomiło | Powłoka root | bez zmian |
| sudo su - | Konto, które uruchomiło | Powłoka logowania root | /root |
| sudo -i | Konto, które uruchomiło | Powłoka logowania root | /root |
| sudo -s | Konto, które uruchomiło | Powłoka ze zmiennej SHELL (uprawnienia root) | bez zmian |
[sudo -i] i [sudo su -] kończą się powłoką logowania root. W [sudo -i] sudo uruchamia powłokę root od razu jako powłokę logowania, a [sudo su -] przechodzi po drodze jeszcze raz przez su.
[sudo -s] uruchamia powłokę ze zmiennej SHELL z uprawnieniami root i nie przechodzi do folderu domowego. Po jednym poprawnym wpisaniu hasła sudo domyślnie nie pyta o nie ponownie w tym samym terminalu przez 5 minut (według podręcznika sudoers).
Różnica między su i sudo jest jak różnica między pożyczeniem czyjegoś klucza do domu a wpisaniem się z nazwiska w portierni, aby wejść.
5️⃣ Błędy polecenia su
Po przełączeniu na konto bez możliwości logowania zamiast powłoki uruchamia się nologin i pojawia się [This account is currently not available.]. Po uruchomieniu [su daemon] z root pojawił się tylko ten jeden wiersz, a kod wyjścia wyniósł 1.
su daemonThis account is currently not available.Ten komunikat wyświetla program nologin zapisany w ostatnim polu wiersza konta, a ten sam tekst znaleziono w /usr/sbin/nologin na serwerze. Jako root możesz wskazać powłokę przez -s i uruchamiać polecenia z tego konta.
Jeśli hasło jest błędne, pojawia się [su: Authentication failure]. Ten tekst to komunikat, który biblioteka PAM zwraca przy nieudanym uwierzytelnieniu. Według oficjalnego podręcznika, jeśli su zawiedzie przed uruchomieniem polecenia, kod wyjścia to 1.
Jeśli su odmawia, choć hasło twojego konta wpisano poprawnie, najpierw sprawdź, czy w tym miejscu nie chodzi o hasło konta docelowego. sudo pyta o hasło osoby, która je uruchamia, a su o hasło konta, na które się przełączasz.
Po wpisaniu nazwy konta, które nie istnieje, pojawia się [su: user user9 does not exist or the user entry does not contain all the required fields] (według komunikatu w programie). Przyczyny i to, co sprawdzić przy każdym błędzie, są poniżej.
| Wynik | Przyczyna | Co sprawdzić |
|---|---|---|
| This account is currently not available. | Powłoką konta docelowego jest nologin | Ostatnie pole wiersza konta w getent passwd; jako root wskaż powłokę przez -s |
| su: Authentication failure | Błędne hasło | Czy to hasło konta docelowego (sudo pyta o twoje) |
| su: user user9 does not exist … | Brak konta o tej nazwie | getent passwd nazwa_konta |
| user1 is not in the sudoers file. | Konto bez zgody na sudo | Ustawienia sudoers i grupa wheel |
🔢 FAQ & polecane treści
Uprawnienia · własność
Uprawnienia Linuksa (4,2,1) i własność | polecenia chmod, chown, umask
Artykuł o tym, jak sprawdzić i zmienić uprawnienia odczytu, zapisu i wykonania oraz właściciela plików i katalogów.
Użytkownicy i dostęp
Polecenia Linux who, w & polecenie user
Polecenia, które pokazują, którzy użytkownicy są teraz zalogowani na serwerze i co uruchamiają.
Sieć i dostęp
Polecenie SSH: opcje i sposób użycia
Artykuł o podstawowej postaci i opcjach polecenia ssh, które łączy się ze zdalnym serwerem z konta użytkownika.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.