Polecenie su: różnica między su i su -, sudo su i sudo -i oraz jak przełączyć konto

Środowisko testoweRodzina RHELAlmaLinux 9.8util-linux 2.37konto rootDebian 12 · util-linux 2.38 zwykłe kontoSprawdzono 2026-11-05
Polecenia użytkowników · grupsuLokalizacja/usr/bin/su
Uruchamianie poleceń z innego konta

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ć i powrót przez exit

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 --version
su from util-linux 2.38.1

Czy konto, na które chcesz się przełączyć, może otworzyć powłokę, widać w ostatnim polu jego wiersza z getent passwd.

getent passwd daemon
daemon:x:2:2:daemon:/sbin:/sbin/nologin

Powł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 -

  • ↪️ Powłoka logowania i zmienne środowiskowe

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
/tmp
su - -s /bin/sh -c pwd daemon
/usr/sbin

Bez łą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/bin
su - -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/sbin

HOME, 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' daemon
sh
su - -s /bin/sh -c 'echo $0' daemon
-sh

W [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ównaniesusu -
Folder roboczyBez zmian (/tmp)Folder domowy konta docelowego (/usr/sbin)
HOME, USER, LOGNAMEWartość daemonWartość daemon
PATHWartość root, który uruchomił suUstawiane na nowo przez ustawienia logowania
Nazwa powłoki ($0)sh-sh (powłoka logowania)
Pozostałe zmienne środowiskoweZostają bez zmianUsuwane 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

  • ↪️ Uruchamianie jednego polecenia i wskazywanie powłoki

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 daemon
This 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 daemon
uid=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

OpcjaZadanieWynik w tym artykule
-Otwiera taką samą powłokę jak przy logowaniu na konto docelowe i przechodzi do jego folderu domowegoW /tmp pwd bez łącznika dało /tmp, a z łącznikiem /usr/sbin, a echo $0 dało -sh
-c polecenieUruchamia jedno polecenie w powłoce konta docelowego bez otwierania powłokiPo uruchomieniu su -c id daemon na koncie z nologin daemon pojawiło się [This account is currently not available.]
-s powłokaUruchamia wskazaną powłokę zamiast zapisanej w koncie; dla kont z powłoką ograniczoną tylko rootsu -s /bin/sh -c id daemon dało uid=2(daemon) gid=2(daemon) groups=2(daemon)
--helpWyświetla sposób użycia i listę opcjiWiersz Usage i lista opcji -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V
--versionWypisuje informacje o wersjisu from util-linux 2.38.1 na serwerze Debian 12

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-lOpcja logowania taka sama jak łącznik (-); długa nazwa --login
-mZostawia zmienne środowiskowe i nie zmienia HOME, SHELL, USER ani LOGNAME; ignorowana razem z opcją logowania (tak samo jak -p)
-w listaZachowuje zmienne wpisane po przecinku, gdy opcja logowania czyści środowisko; HOME, SHELL, USER, LOGNAME i PATH są ustawiane na nowo
-g grupaWskazuje grupę podstawową; tylko root
-G grupaWskazuje grupy dodatkowe; tylko root; bez -g pierwsza grupa dodatkowa staje się grupą podstawową
-fPrzekazuje -f do powłoki; opcja używana w csh i tcsh
-PTworzy nowy pseudoterminal, aby nie dzielić terminala z pierwotną sesją
--session-command polecenieTak 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.

Symulator polecenia suutil-linux 2.37
[user1@server1 ~]$
Działa tylko w przeglądarce; konta i hasła to wartości przykładowe, a ↑↓ przywołują wcześniejsze polecenia (hasła nie zostają w historii).

4️⃣ Różnica między sudo su i sudo -i

  • ↪️ O jakie hasło pyta i jak zmienia się folder

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).

PolecenieHasło, o które pytaUruchamiana powłokaFolder roboczy
surootPowłoka rootbez zmian
su -rootPowłoka logowania root/root
sudo suKonto, które uruchomiłoPowłoka rootbez zmian
sudo su -Konto, które uruchomiłoPowłoka logowania root/root
sudo -iKonto, które uruchomiłoPowłoka logowania root/root
sudo -sKonto, które uruchomiłoPowł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

  • ↪️ This account is currently not available · Authentication failure

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 daemon
This 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.

WynikPrzyczynaCo sprawdzić
This account is currently not available.Powłoką konta docelowego jest nologinOstatnie pole wiersza konta w getent passwd; jako root wskaż powłokę przez -s
su: Authentication failureBłędne hasłoCzy to hasło konta docelowego (sudo pyta o twoje)
su: user user9 does not exist …Brak konta o tej nazwiegetent passwd nazwa_konta
user1 is not in the sudoers file.Konto bez zgody na sudoUstawienia sudoers i grupa wheel

🔢 FAQ & polecane treści

Oficjalny podręcznik opisuje su głównie jako polecenie dla zwykłych użytkowników, a do skryptów uruchamianych przez root zaleca polecenie runuser, które nie przechodzi przez uwierzytelnianie. Postać to [runuser -u konto -- polecenie].

Jeśli po -w (--whitelist-environment) wpiszesz nazwy zmiennych do zachowania, oddzielone przecinkami, [su -] zachowa te zmienne przy czyszczeniu środowiska. Według oficjalnego podręcznika HOME, SHELL, USER, LOGNAME i PATH są ustawiane na nowo, nawet jeśli są na liście.

Według oficjalnego podręcznika su zawsze zapisuje nieudane próby logowania w pliku btmp i nie zapisuje nic w pliku lastlog. Wpisy btmp sprawdzisz poleceniem lastb.

ℹ️ 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 3   +   7   =