su-Befehl: Unterschied zwischen su und su -, sudo su und sudo -i und wie du das Konto wechselst
Wenn du unter Linux Befehle mit einem anderen Konto ausführen willst, ohne dich vom aktuellen Konto abzumelden, verwendest du den su-Befehl. Beim Vergleich, bei dem su vom root-Konto eines AlmaLinux-9-Servers zum Systemkonto daemon ohne Anmeldemöglichkeit ausgeführt wurde, änderte ein einziger Bindestrich den Arbeitsordner und PATH, und Befehle liefen erst, nachdem eine Shell angegeben wurde.
Die Ausgaben unten stammen von einem AlmaLinux-9.8-Server (root-Konto) und einem Debian-12-Server (normales Konto). Die Passwortabfragen und sudo wurden nicht auf einem Produktivserver ausgeführt, sondern nach den offiziellen Handbüchern zusammengefasst; ein Teil des PATH-Werts und die Patch-Versionsnummer von util-linux im Simulator wurden durch Beispielwerte ersetzt.
1️⃣ So verwendest du den su-Befehl
Die Grundform ist [su Kontoname], und wenn du den Kontonamen weglässt, wechselt su zu root. Gibst du in der neuen Shell exit ein, endet diese Shell, und du kehrst zur Shell des ursprünglichen Kontos zurück, das su ausgeführt hat.
Führst du es von einem normalen Konto aus, gibst du in der Zeile Password: das Passwort des Zielkontos ein (nach der Standardeinstellung von PAM). Auf diesem Server überspringt /etc/pam.d/su die Authentifizierung, wenn root es ausführt, deshalb wurde beim Wechsel vom root-Konto zu daemon kein Passwort abgefragt.
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).Wie in der Hilfe steht, ist der Bindestrich [-] die Login-Option und entspricht [-l], und Argumente nach dem Kontonamen werden an die Shell des Zielkontos weitergegeben. Auf dem AlmaLinux-9-Server stammte su aus dem Paket util-linux 2.37, auf dem Debian-12-Server aus dem Paket 2.38.
su --versionsu from util-linux 2.38.1Ob das Konto, zu dem du wechseln willst, eine Shell öffnen kann, siehst du im letzten Feld seiner Zeile in getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinDie Shell von daemon war /sbin/nologin. Bei einem Konto, das statt einer Login-Shell nologin eingetragen hat, öffnet su auch nach dem Wechsel keine Shell.
2️⃣ Unterschied zwischen su und su -
Mit einem Bindestrich (-) öffnet su dieselbe Shell, die du bei einer Anmeldung mit dem Zielkonto bekämst. Im Ordner /tmp wurde derselbe Befehl einmal ohne und einmal mit Bindestrich ausgeführt.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinOhne Bindestrich blieb der Arbeitsordner /tmp, während [su -] in den Home-Ordner von daemon, /sbin, wechselte. Auf diesem Server ist /sbin ein Link auf /usr/sbin, deshalb zeigte pwd /usr/sbin an.
Bei den Umgebungsvariablen wurden aus der Ausgabe von env nur fünf Zeilen verglichen: HOME, USER, SHELL, PATH und 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 und LOGNAME wechselten in beiden Fällen auf die Werte von daemon. Ohne Bindestrich behielt PATH den Wert von root, das su ausgeführt hatte, und mit [su -] wurde PATH nach den Login-Einstellungen neu gesetzt.
Laut offiziellem Handbuch ändert su ohne Bindestrich nur HOME und SHELL und ändert USER und LOGNAME nur dann mit, wenn das Zielkonto nicht root ist. Wechselst du also von einem normalen Konto ohne Bindestrich zu root, bleibt in USER der ursprüngliche Kontoname stehen.
Auch [$0], das den Shell-Namen ausgibt, war unterschiedlich.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shBei [su -] stand ein Bindestrich vor dem Shell-Namen, und es erschien -sh. Eine Shell, deren Name mit einem Bindestrich beginnt, arbeitet als Login-Shell und liest die Login-Konfigurationsdateien (laut offiziellem Handbuch). Die Unterschiede zwischen beiden Formen siehst du unten.
| Vergleich | su | su - |
|---|---|---|
| Arbeitsordner | Unverändert (/tmp) | Home-Ordner des Zielkontos (/usr/sbin) |
| HOME, USER, LOGNAME | Wert von daemon | Wert von daemon |
| PATH | Wert von root, das su ausgeführt hat | Neu gesetzt durch die Login-Einstellungen |
| Shell-Name ($0) | sh | -sh (Login-Shell) |
| Andere Umgebungsvariablen | Bleiben erhalten | Bis auf einige wie TERM gelöscht (laut offiziellem Handbuch) |
Das offizielle Handbuch empfiehlt, die Login-Option immer anzugeben, damit sich die Umgebungen nicht vermischen, und statt des Bindestrichs [--login] zu schreiben. su ohne Bindestrich behält den aktuellen Ordner und PATH bei, deshalb kann das Ergebnis von [su -] abweichen, wenn du einen Befehl mit den Einstellungen eines anderen Kontos prüfen willst.
3️⃣ Optionen su -c und su -s
Um nur einen Befehl mit einem anderen Konto auszuführen, ohne eine Shell zu öffnen, schreibst du den Befehl hinter -c. Als id mit [su -c] auf dem nologin-Konto ausgeführt wurde, erschien statt der Befehlsausgabe eine Ablehnungsmeldung.
su -c id daemonThis account is currently not available.Auch ein mit -c übergebener Befehl wird von der Shell des Kontos ausgeführt, deshalb kommt der Befehl gar nicht erst zum Zug, wenn die Shell nologin ist. Dann gibst du mit -s die Shell an, die ausgeführt werden soll.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)Mit /bin/sh lief id mit der UID 2 von daemon. Diese Form verwendest du, wenn du Dateirechte oder Befehlsergebnisse mit einem Dienstkonto prüfen willst.
Ist die Shell des Zielkontos eine eingeschränkte Shell, die nicht in /etc/shells steht, wie nologin, kann nur root die Shell mit -s ändern. Laut offiziellem Handbuch werden -s und die Variable SHELL, die ein Benutzer außer root angibt, in diesem Fall ignoriert.
Enthält der Befehl hinter -c Leerzeichen, setzt du ihn in Anführungszeichen, damit er als ein Stück übergeben wird. su gibt den Exit-Code des ausgeführten Befehls unverändert zurück, 126, wenn der Befehl nicht ausgeführt werden konnte, und 127, wenn er nicht gefunden wurde (laut offiziellem Handbuch).
📌 Wichtige Optionen: Ergebnisse aus diesem Artikel
| Option | Was es tut | Ergebnis in diesem Artikel | |
|---|---|---|---|
| - | Öffnet dieselbe Shell wie bei einer Anmeldung mit dem Zielkonto und wechselt in dessen Home-Ordner | In /tmp war pwd ohne Bindestrich /tmp und mit Bindestrich /usr/sbin, und echo $0 ergab -sh | |
| -c Befehl | Führt einen Befehl mit der Shell des Zielkontos aus, ohne eine Shell zu öffnen | su -c id daemon auf dem nologin-Konto daemon ergab [This account is currently not available.] | |
| -s Shell | Führt statt der im Konto eingetragenen Shell die angegebene Shell aus; bei Konten mit eingeschränkter Shell nur root | su -s /bin/sh -c id daemon ergab uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Zeigt Verwendung und Optionsliste an | Zeile Usage und Optionsliste -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Gibt Versionsinformationen aus | su from util-linux 2.38.1 auf dem Debian-12-Server |
📎 Weitere Optionen: laut offiziellem Handbuch
| Option | Was es tut | |
|---|---|---|
| -l | Login-Option wie der Bindestrich (-); Langform --login | |
| -m | Lässt Umgebungsvariablen unverändert und ändert auch HOME, SHELL, USER und LOGNAME nicht; mit der Login-Option ignoriert (wie -p) | |
| -w Liste | Behält die mit Kommas angegebenen Variablen, wenn die Login-Option die Umgebung leert; HOME, SHELL, USER, LOGNAME und PATH werden neu gesetzt | |
| -g Gruppe | Legt die primäre Gruppe fest; nur root | |
| -G Gruppe | Legt Zusatzgruppen fest; nur root; ohne -g wird die erste Zusatzgruppe zur primären Gruppe | |
| -f | Übergibt -f an die Shell; Option für csh und tcsh | |
| -P | Erstellt ein neues Pseudoterminal, damit das Terminal nicht mit der ursprünglichen Sitzung geteilt wird | |
| --session-command Befehl | Wie -c, erstellt aber keine neue Sitzung; das Handbuch rät davon ab |
🔲 su-Befehl-Simulator
Der Simulator unten startet mit dem normalen Konto user1, und du kannst selbst su, [su -] und sudo eingeben und mit exit zurückkehren. Konten und Passwörter sind Beispielwerte.
4️⃣ Unterschied zwischen sudo su und sudo -i
sudo su führt su über sudo mit root-Rechten aus. Weil root su ausführt, wird das root-Passwort nicht abgefragt, und vorher fragt sudo das Passwort der Person ab, die es ausführt (laut offizieller Dokumentation).
Welche Konten sudo ausführen dürfen, bestimmt die /etc/sudoers-Konfiguration. Führt ein nicht berechtigtes Konto sudo aus, wird es mit [user1 is not in the sudoers file.] abgelehnt (laut Meldung im Programm).
Für jeden Befehl, der eine root-Shell öffnet, siehst du unten das abgefragte Passwort und den Arbeitsordner. Die Befehle in diesem Abschnitt wurden nicht auf einem Produktivserver ausgeführt, sondern nach den Handbüchern su(1) und sudo(8) zusammengefasst.
| Befehl | Abgefragtes Passwort | Gestartete Shell | Arbeitsordner |
|---|---|---|---|
| su | root | root-Shell | Unverändert |
| su - | root | root-Login-Shell | /root |
| sudo su | Ausführendes Konto | root-Shell | Unverändert |
| sudo su - | Ausführendes Konto | root-Login-Shell | /root |
| sudo -i | Ausführendes Konto | root-Login-Shell | /root |
| sudo -s | Ausführendes Konto | Shell aus der Variablen SHELL (root-Rechte) | Unverändert |
[sudo -i] und [sudo su -] enden beide in einer root-Login-Shell. Bei [sudo -i] startet sudo die Shell von root direkt als Login-Shell, während [sudo su -] dazwischen noch einmal über su geht.
[sudo -s] führt die Shell aus der Variablen SHELL mit root-Rechten aus und wechselt nicht in den Home-Ordner. Hast du das Passwort einmal richtig eingegeben, fragt sudo im selben Terminal standardmäßig 5 Minuten lang nicht erneut (laut sudoers-Handbuch).
Der Unterschied zwischen su und sudo ist wie der Unterschied, ob du dir den Hausschlüssel leihst oder dich beim Hausmeister mit Namen einträgst, um hineinzukommen.
5️⃣ Fehler beim su-Befehl
Wechselst du zu einem Konto ohne Anmeldemöglichkeit, läuft statt einer Shell nologin, und es erscheint [This account is currently not available.]. Als root [su daemon] ausführte, erschien nur diese eine Zeile, und der Exit-Code war 1.
su daemonThis account is currently not available.Diese Meldung gibt das Programm nologin aus, das im letzten Feld der Kontozeile steht, und derselbe Text fand sich in /usr/sbin/nologin auf dem Server. Als root kannst du mit -s eine Shell angeben und Befehle mit diesem Konto ausführen.
Ist das Passwort falsch, erscheint [su: Authentication failure]. Dieser Text ist die Meldung, die die PAM-Bibliothek bei einer fehlgeschlagenen Authentifizierung zurückgibt. Laut offiziellem Handbuch ist der Exit-Code 1, wenn su scheitert, bevor es den Befehl ausführt.
Lehnt su ab, obwohl du das Passwort deines Kontos richtig eingegeben hast, prüfe zuerst, ob hier das Passwort des Zielkontos gefragt ist. sudo fragt das Passwort der ausführenden Person ab, su dagegen das Passwort des Kontos, zu dem du wechselst.
Gibst du einen Kontonamen ein, den es nicht gibt, erscheint [su: user user9 does not exist or the user entry does not contain all the required fields] (laut Meldung im Programm). Ursache und Prüfpunkte für jeden Fehler siehst du unten.
| Ausgabe | Ursache | Was zu prüfen ist |
|---|---|---|
| This account is currently not available. | Shell des Zielkontos ist nologin | Letztes Feld der Kontozeile in getent passwd; als root mit -s eine Shell angeben |
| su: Authentication failure | Passwort falsch | Ob es das Passwort des Zielkontos ist (sudo fragt dein eigenes) |
| su: user user9 does not exist … | Kein Konto mit diesem Namen | getent passwd Kontoname |
| user1 is not in the sudoers file. | Konto ohne sudo-Berechtigung | sudoers-Einstellungen und Gruppe wheel |
🔢 FAQ & empfohlene Inhalte
Rechte · Eigentümer
Linux-Rechte (4,2,1) und Besitz | chmod-, chown-, umask-Befehle
Ein Artikel darüber, wie du Lese-, Schreib- und Ausführungsrechte sowie Eigentümer von Dateien und Verzeichnissen prüfst und änderst.
Benutzer und Zugriff
Linux-Befehle who und w & user-Befehl
Befehle, die zeigen, welche Benutzer gerade am Server angemeldet sind und was sie ausführen.
Netzwerk und Zugriff
SSH-Befehl: Optionen und Verwendung
Ein Artikel über Grundform und Optionen des ssh-Befehls, mit dem du dich mit einem Benutzerkonto auf einem entfernten Server anmeldest.
ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.