su-commando: verschil tussen su en su -, sudo su en sudo -i, en zo wissel je van account
Wil je in Linux opdrachten uitvoeren met een ander account zonder uit te loggen bij het huidige account, dan gebruik je het su-commando. Bij een vergelijking waarbij su werd uitgevoerd vanaf het root-account van een AlmaLinux 9-server naar daemon, een systeemaccount dat niet kan inloggen, veranderde één koppelteken de werkmap en PATH, en liep de opdracht pas nadat er een shell was opgegeven.
De uitvoer hieronder komt van een AlmaLinux 9.8-server (root-account) en een Debian 12-server (gewoon account). De wachtwoordvragen en sudo zijn niet op een productieserver uitgevoerd maar samengevat volgens de officiële handleidingen, en een deel van de PATH-waarde en het patchversienummer van util-linux in de simulator zijn vervangen door voorbeeldwaarden.
1️⃣ Zo gebruik je het su-commando
De basisvorm is [su accountnaam], en als je de accountnaam weglaat, wisselt su naar root. Typ je exit in de nieuwe shell, dan stopt die shell en ga je terug naar de shell van het oorspronkelijke account dat su uitvoerde.
Voer je het uit vanaf een gewoon account, dan typ je bij de regel Password: het wachtwoord van het doelaccount (volgens de standaardinstelling van PAM). Op deze server slaat /etc/pam.d/su de authenticatie over als root het uitvoert, daarom werd er geen wachtwoord gevraagd bij het wisselen van het root-account naar daemon.
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).Zoals de help vermeldt, is het koppelteken [-] de login-optie, gelijk aan [-l], en argumenten na de accountnaam gaan naar de shell van het doelaccount. Op de AlmaLinux 9-server kwam su uit het pakket util-linux 2.37 en op de Debian 12-server uit het pakket 2.38.
su --versionsu from util-linux 2.38.1Of het account waarnaar je wilt wisselen een shell kan openen, zie je in het laatste veld van de regel uit getent passwd.
getent passwd daemondaemon:x:2:2:daemon:/sbin:/sbin/nologinDe shell van daemon was /sbin/nologin. Bij een account met nologin in plaats van een login-shell opent su geen shell, ook niet na het wisselen.
2️⃣ Verschil tussen su en su -
Met een koppelteken (-) opent su dezelfde shell die je krijgt als je inlogt met het doelaccount. In de map /tmp werd dezelfde opdracht één keer zonder en één keer met koppelteken uitgevoerd.
su -s /bin/sh -c pwd daemon/tmpsu - -s /bin/sh -c pwd daemon/usr/sbinZonder koppelteken bleef de werkmap /tmp, terwijl [su -] naar de thuismap van daemon, /sbin, ging. Op deze server is /sbin een link naar /usr/sbin, daarom toonde pwd /usr/sbin.
Van de omgevingsvariabelen werden alleen vijf regels uit de uitvoer van env vergeleken: HOME, USER, SHELL, PATH en 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 en LOGNAME kregen in beide gevallen de waarden van daemon. Zonder koppelteken hield PATH de waarde van root, dat su uitvoerde, en met [su -] werd PATH opnieuw ingesteld volgens de login-instellingen.
Volgens de officiële handleiding verandert su zonder koppelteken alleen HOME en SHELL, en verandert het USER en LOGNAME alleen mee als het doelaccount niet root is. Wissel je dus vanaf een gewoon account zonder koppelteken naar root, dan blijft in USER de oorspronkelijke accountnaam staan.
Ook [$0], dat de naam van de shell toont, was anders.
su -s /bin/sh -c 'echo $0' daemonshsu - -s /bin/sh -c 'echo $0' daemon-shBij [su -] stond er een koppelteken voor de naam van de shell en verscheen -sh. Een shell waarvan de naam met een koppelteken begint, werkt als login-shell en leest de login-configuratiebestanden (volgens de officiële handleiding). De verschillen tussen de twee vormen zie je hieronder.
| Vergelijking | su | su - |
|---|---|---|
| Werkmap | Ongewijzigd (/tmp) | Thuismap van het doelaccount (/usr/sbin) |
| HOME, USER, LOGNAME | Waarde van daemon | Waarde van daemon |
| PATH | Waarde van root, dat su uitvoerde | Opnieuw ingesteld door de login-instellingen |
| Naam van de shell ($0) | sh | -sh (login-shell) |
| Andere omgevingsvariabelen | Blijven behouden | Gewist op enkele na, zoals TERM (volgens de officiële handleiding) |
De officiële handleiding raadt aan altijd de login-optie mee te geven zodat omgevingen niet door elkaar lopen, en [--login] te schrijven in plaats van het koppelteken. su zonder koppelteken behoudt de huidige map en PATH, dus als je een opdracht wilt controleren met de instellingen van een ander account, kan het resultaat afwijken van [su -].
3️⃣ Opties su -c en su -s
Om maar één opdracht met een ander account uit te voeren zonder een shell te openen, zet je de opdracht achter -c. Toen id met [su -c] werd uitgevoerd op het nologin-account, verscheen een weigeringsmelding in plaats van de uitvoer van de opdracht.
su -c id daemonThis account is currently not available.Ook een opdracht die je met -c meegeeft, wordt door de shell van het account uitgevoerd, dus als die shell nologin is, komt de opdracht nooit aan de beurt. Geef dan met -s de shell op die moet worden uitgevoerd.
su -s /bin/sh -c id daemonuid=2(daemon) gid=2(daemon) groups=2(daemon)Met /bin/sh liep id als UID 2 van daemon. Gebruik deze vorm om bestandsrechten of opdrachtresultaten met een serviceaccount te controleren.
Is de shell van het doelaccount een beperkte shell die niet in /etc/shells staat, zoals nologin, dan kan alleen root de shell met -s wijzigen. Volgens de officiële handleiding worden -s en de variabele SHELL van een andere gebruiker dan root in dat geval genegeerd.
Bevat de opdracht achter -c spaties, zet hem dan tussen aanhalingstekens zodat hij als één geheel wordt doorgegeven. su geeft de exitcode van de uitgevoerde opdracht ongewijzigd terug, 126 als de opdracht niet kon worden uitgevoerd en 127 als hij niet werd gevonden (volgens de officiële handleiding).
📌 Belangrijkste opties: resultaten uit dit artikel
| Optie | Taak | Resultaat in dit artikel | |
|---|---|---|---|
| - | Opent dezelfde shell als bij inloggen met het doelaccount en gaat naar de thuismap van dat account | Vanuit /tmp gaf pwd zonder koppelteken /tmp en met koppelteken /usr/sbin, en echo $0 gaf -sh | |
| -c opdracht | Voert één opdracht uit met de shell van het doelaccount zonder een shell te openen | su -c id daemon op het nologin-account daemon gaf [This account is currently not available.] | |
| -s shell | Voert de opgegeven shell uit in plaats van die van het account; bij accounts met een beperkte shell alleen root | su -s /bin/sh -c id daemon gaf uid=2(daemon) gid=2(daemon) groups=2(daemon) | |
| --help | Toont het gebruik en de lijst met opties | Regel Usage en de optielijst -m, -w, -g, -G, -l, -c, -f, -s, -P, -h, -V | |
| --version | Toont versie-informatie | su from util-linux 2.38.1 op de Debian 12-server |
📎 Andere opties: volgens de officiële handleiding
| Optie | Taak | |
|---|---|---|
| -l | Login-optie, gelijk aan het koppelteken (-); lange naam --login | |
| -m | Laat omgevingsvariabelen staan en verandert ook HOME, SHELL, USER en LOGNAME niet; genegeerd samen met de login-optie (gelijk aan -p) | |
| -w lijst | Behoudt de met komma's opgegeven variabelen als de login-optie de omgeving leegmaakt; HOME, SHELL, USER, LOGNAME en PATH worden opnieuw ingesteld | |
| -g groep | Stelt de primaire groep in; alleen root | |
| -G groep | Stelt aanvullende groepen in; alleen root; zonder -g wordt de eerste aanvullende groep de primaire groep | |
| -f | Geeft -f door aan de shell; optie voor csh en tcsh | |
| -P | Maakt een nieuwe pseudoterminal zodat de terminal niet met de oorspronkelijke sessie wordt gedeeld | |
| --session-command opdracht | Gelijk aan -c maar zonder nieuwe sessie; de handleiding raadt het af |
🔲 Simulator voor het su-commando
De simulator hieronder start met het gewone account user1, en je kunt zelf su, [su -] en sudo invoeren en met exit terugkeren. Accounts en wachtwoorden zijn voorbeeldwaarden.
4️⃣ Verschil tussen sudo su en sudo -i
sudo su voert su via sudo uit met root-rechten. Omdat root su uitvoert, wordt het root-wachtwoord niet gevraagd, en vraagt sudo eerst het wachtwoord van wie het uitvoert (volgens de officiële documentatie).
Welke accounts sudo mogen uitvoeren, staat in de /etc/sudoers-instellingen. Voert een account zonder toestemming sudo uit, dan wordt het geweigerd met [user1 is not in the sudoers file.] (volgens de melding in het programma).
Per opdracht die een root-shell opent, zie je hieronder het gevraagde wachtwoord en de werkmap. De opdrachten in dit deel zijn niet op een productieserver uitgevoerd en zijn samengevat volgens de handleidingen su(1) en sudo(8).
| Commando | Gevraagd wachtwoord | Gestarte shell | Werkmap |
|---|---|---|---|
| su | root | root-shell | ongewijzigd |
| su - | root | root-login-shell | /root |
| sudo su | Account dat het uitvoerde | root-shell | ongewijzigd |
| sudo su - | Account dat het uitvoerde | root-login-shell | /root |
| sudo -i | Account dat het uitvoerde | root-login-shell | /root |
| sudo -s | Account dat het uitvoerde | Shell uit de variabele SHELL (root-rechten) | ongewijzigd |
[sudo -i] en [sudo su -] eindigen allebei in een root-login-shell. Bij [sudo -i] start sudo de shell van root direct als login-shell, terwijl [sudo su -] daartussen nog een keer via su gaat.
[sudo -s] voert de shell uit de variabele SHELL uit met root-rechten en gaat niet naar de thuismap. Heb je het wachtwoord één keer goed ingevoerd, dan vraagt sudo het standaard 5 minuten lang niet opnieuw in dezelfde terminal (volgens de handleiding van sudoers).
Het verschil tussen su en sudo is als het verschil tussen iemands huissleutel lenen en je naam opschrijven bij de beheerder om binnen te komen.
5️⃣ Fouten bij het su-commando
Wissel je naar een account dat niet kan inloggen, dan draait nologin in plaats van een shell en verschijnt [This account is currently not available.]. Toen root [su daemon] uitvoerde, verscheen alleen deze ene regel en was de exitcode 1.
su daemonThis account is currently not available.Deze melding komt van het programma nologin dat in het laatste veld van de accountregel staat, en dezelfde tekst stond in /usr/sbin/nologin op de server. Als root kun je met -s een shell opgeven en opdrachten met dat account uitvoeren.
Is het wachtwoord fout, dan verschijnt [su: Authentication failure]. Deze tekst is de melding die de PAM-bibliotheek teruggeeft bij een mislukte authenticatie. Volgens de officiële handleiding is de exitcode 1 als su mislukt voordat de opdracht wordt uitgevoerd.
Weigert su terwijl je het wachtwoord van je eigen account goed hebt ingevoerd, controleer dan eerst of hier het wachtwoord van het doelaccount wordt gevraagd. sudo vraagt het wachtwoord van wie het uitvoert, su vraagt het wachtwoord van het account waarnaar je wisselt.
Typ je een accountnaam die niet bestaat, dan verschijnt [su: user user9 does not exist or the user entry does not contain all the required fields] (volgens de melding in het programma). De oorzaak en wat je moet controleren per fout zie je hieronder.
| Uitvoer | Oorzaak | Wat te controleren |
|---|---|---|
| This account is currently not available. | Shell van het doelaccount is nologin | Laatste veld van de accountregel in getent passwd; als root een shell opgeven met -s |
| su: Authentication failure | Wachtwoord klopt niet | Of het het wachtwoord van het doelaccount is (sudo vraagt je eigen wachtwoord) |
| su: user user9 does not exist … | Geen account met die naam | getent passwd accountnaam |
| user1 is not in the sudoers file. | Account zonder toestemming voor sudo | sudoers-instellingen en de groep wheel |
🔢 FAQ & aanbevolen content
Rechten · eigendom
Linux-rechten (4,2,1) en eigendom | chmod-, chown-, umask-commando's
Een artikel over het bekijken en wijzigen van lees-, schrijf- en uitvoerrechten en de eigenaar van bestanden en mappen.
Gebruikers en toegang
Linux-commando's who en w & user-commando
Commando's die tonen welke gebruikers nu op de server zijn ingelogd en wat ze uitvoeren.
Netwerk en toegang
SSH-commando: opties en gebruik
Een artikel over de basisvorm en opties van het ssh-commando, waarmee je met een gebruikersaccount verbinding maakt met een externe server.
ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.