useradd vs adduser: Technische Unterschiede, Anwendungsfälle und wann welches verwendet werden sollte
`useradd` ist ein Low-Level-Binär-Dienstprogramm, das auf nahezu jeder Linux-Distribution verfügbar ist und Benutzerkonten erstellt, indem es direkt in `/etc/passwd`, `/etc/shadow` und `/etc/group` schreibt. `adduser` ist ein übergeordnetes Wrapper-Skript — typischerweise in Perl auf Debian-basierten Systemen geschrieben — das `useradd` intern aufruft und dabei die Erstellung des Home-Verzeichnisses, die Befüllung von Skeleton-Dateien, die Passwortabfrage und die Erfassung von GECOS-Feldern automatisiert. Der praktische Unterschied liegt nicht nur in der Benutzerfreundlichkeit: Die Wahl des falschen Werkzeugs in einer automatisierten Bereitstellungspipeline oder auf einem Nicht-Debian-System kann stillschweigend unvollständige Benutzerkonten erzeugen.
Beide Befehle registrieren letztendlich einen Benutzer in der Authentifizierungsdatenbank des Systems, aber ihr Verhalten unterscheidet sich erheblich in Bezug auf Standardeinstellungen, Interaktivität, Portabilität und Skriptfähigkeit. Dieser Leitfaden behandelt jeden technischen Unterschied, den ein Administrator benötigt, um eine fundierte Entscheidung zu treffen.
Was useradd tatsächlich im Hintergrund tut
`useradd` ist Teil des shadow-utils-Pakets (auf älteren Distributionen manchmal `passwd` genannt). Bei der Ausführung führt es eine Reihe atomarer Operationen durch:
- Liest `/etc/login.defs`, um Standard-UID-Bereiche, Passwort-Alterungsrichtlinien und ob standardmäßig ein Home-Verzeichnis erstellt werden soll, zu bestimmen.
- Liest `/etc/default/useradd` für die Standard-Shell, den Skeleton-Verzeichnispfad und das Gruppenverhalten.
- Schreibt einen neuen Eintrag in `/etc/passwd` und `/etc/shadow`.
- Erstellt optional ein Home-Verzeichnis und kopiert Dateien aus `/etc/skel`, wenn `-m` explizit übergeben wird.
- Erstellt optional eine private Gruppe, die dem Benutzernamen entspricht, wenn `USERGROUPS_ENAB` in `/etc/login.defs` auf `yes` gesetzt ist.
Ein kritischer Punkt, den viele Leitfäden auslassen: Auf Red Hat-basierten Distributionen (RHEL, CentOS, Rocky Linux, AlmaLinux) erstellt `useradd` das Home-Verzeichnis standardmäßig, weil `/etc/login.defs` `CREATE_HOME yes` setzt. Auf Debian und Ubuntu ist dies nicht der Fall — das Flag `-m` ist obligatorisch, es sei denn, Sie ändern `/etc/default/useradd`. Diese Verhaltensasymmetrie ist eine häufige Quelle der Verwirrung, wenn Administratoren zwischen Distributionsfamilien wechseln.
Wichtige Flags und ihr Verhalten
| Flag | Zweck | Hinweise |
|---|---|---|
| —— | ——— | ——- |
| `-m` | Home-Verzeichnis erstellen | Auf Debian/Ubuntu ohne Konfigurationsänderung erforderlich |
| `-d /path` | Benutzerdefinierten Home-Verzeichnispfad festlegen | Erstellt das Verzeichnis nicht, es sei denn, `-m` wird ebenfalls verwendet |
| `-s /bin/bash` | Login-Shell festlegen | Standardmäßig `/bin/sh` oder Wert in `/etc/default/useradd` |
| `-u UID` | Bestimmte UID zuweisen | Muss eindeutig sein; verwenden Sie `-o`, um Duplikate zuzulassen |
| `-g GID` | Primärgruppe festlegen | Gruppe muss bereits existieren |
| `-G group1,group2` | Ergänzende Gruppen hinzufügen | Kommagetrennt, keine Leerzeichen |
| `-e YYYY-MM-DD` | Ablaufdatum des Kontos | Wird in `/etc/shadow` Feld 8 geschrieben |
| `-f days` | Passwort-Inaktivitätszeitraum | Tage nach Ablauf, bevor das Konto gesperrt wird |
| `-r` | Systemkonto erstellen | UID unterhalb von `SYS_UID_MAX` in `/etc/login.defs`, standardmäßig kein Home-Verzeichnis |
| `-M` | Explizit kein Home-Verzeichnis erstellen | Überschreibt Distro-Standardeinstellungen |
| `-N` | Keine private Benutzergruppe erstellen | Die primäre Gruppe des Benutzers wird zur Standardgruppe |
| `-k /path` | Alternatives Skeleton-Verzeichnis angeben | Überschreibt `/etc/skel` |
Praktisches useradd-Beispiel mit vollständigen Optionen
“`bash
useradd
-m
-d /srv/appuser
-s /bin/bash
-u 1500
-g developers
-G sudo,docker
-e 2025-12-31
-c "Application Service Account"
appuser
passwd appuser
“`
Es wird kein Passwort gesetzt, bis `passwd` aufgerufen wird. Bis dahin existiert das Konto, ist aber gesperrt — der Shadow-Eintrag enthält `!` als Passwort-Hash, was die Anmeldung über Passwort-Authentifizierung verhindert. Die SSH-Schlüssel-basierte Anmeldung ist von diesem Zustand jedoch nicht betroffen.
Was adduser tatsächlich im Hintergrund tut
Auf Debian und Ubuntu ist `adduser` ein Perl-Skript, das sich unter `/usr/sbin/adduser` befindet. Es liest seine eigene Konfiguration aus `/etc/adduser.conf` — einer separaten Datei von `/etc/login.defs` — und ruft dann `useradd` mit den entsprechenden Flags basierend auf dieser Konfiguration und Benutzereingaben auf.
Das Skript führt zusätzliche Schritte durch, die `useradd` allein nicht ausführt:
- Fordert interaktiv ein Passwort an und bestätigt es mit einer zweiten Eingabe.
- Erfasst GECOS-Felder (vollständiger Name, Zimmernummer, Arbeitstelefon, Heimtelefon, Sonstiges) über geführte Eingabeaufforderungen.
- Kopiert Skeleton-Dateien aus `/etc/skel` automatisch, ohne `-m` zu benötigen.
- Setzt korrekte Eigentümerschaft und Berechtigungen für das Home-Verzeichnis.
- Fügt den Benutzer optional zu ergänzenden Gruppen hinzu, die in `/etc/adduser.conf` definiert sind.
Auf Red Hat-basierten Systemen ist `adduser` typischerweise ein Symlink zu `useradd`, was bedeutet, dass es sich identisch zum Low-Level-Binary verhält — es gibt keinen interaktiven Wrapper. Dies ist das wichtigste Portabilitätsproblem beim Schreiben von distributionsübergreifenden Skripten.
adduser-Konfigurationsdatei: /etc/adduser.conf
Wichtige Direktiven in `/etc/adduser.conf`, die das Verhalten beeinflussen:
“`
DSHELL=/bin/bash # Default shell
DHOME=/home # Parent directory for home directories
GROUPHOMES=no # Whether to create group-named subdirectories
LETTERHOMES=no # Whether to use first-letter subdirectories
USERGROUPS=yes # Create a group with the same name as the user
USERS_GID=100 # Default GID if USERGROUPS=no
DIR_MODE=0755 # Permissions on new home directories
SETGID_HOME=no
QUOTAUSER=""
SKEL=/etc/skel
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|tmp)"
“`
Durch die Änderung dieser Datei können Sie die Benutzererstellung über eine Flotte von Debian/Ubuntu-Servern standardisieren, ohne jedes Mal Flags übergeben zu müssen.
Praktisches adduser-Beispiel
“`bash
adduser customuser
“`
Die interaktive Sitzung sieht folgendermaßen aus:
“`
Adding user 'customuser' …
Adding new group 'customuser' (1001) …
Adding new user 'customuser' (1001) with group 'customuser' …
Creating home directory '/home/customuser' …
Copying files from '/etc/skel' …
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for customuser
Enter the new value, or press ENTER for the default
Full Name []: Jane Smith
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
“`
Um einen bestehenden Benutzer nicht-interaktiv mit `adduser` zu einer Gruppe hinzuzufügen:
“`bash
adduser customuser sudo
“`
Dies ist eine bemerkenswerte Funktion: `adduser` dient auch als Verwaltungswerkzeug für Gruppenmitgliedschaften, was `useradd` nicht mit einem einzigen Befehl repliziert.
Direkter Vergleich
| Funktion | `useradd` | `adduser` |
|---|---|---|
| — | — | — |
| Typ | Binary (C-Programm) | Skript (Perl auf Debian, Symlink auf RHEL) |
| Interaktivität | Nicht-interaktiv; alle Optionen über Flags | Interaktive Eingabeaufforderungen standardmäßig |
| Home-Verzeichnis | Wird nicht erstellt, es sei denn, `-m` wird übergeben (Debian) | Wird automatisch erstellt |
| Passwort-Einrichtung | Erfordert separaten `passwd`-Befehl | Wird während der Erstellung abgefragt |
| GECOS-Felder | Über `-c`-Flag als einzelne Zeichenkette gesetzt | Werden interaktiv Feld für Feld erfasst |
| Skeleton-Dateien | Nur mit `-m`-Flag kopiert | Immer kopiert |
| Konfigurationsdatei | `/etc/login.defs`, `/etc/default/useradd` | `/etc/adduser.conf` |
| Distributionsübergreifende Verfügbarkeit | Alle Linux-Distributionen | Nur Debian/Ubuntu (als Wrapper-Skript) |
| Skript-Eignung | Ausgezeichnet — vollständig nicht-interaktiv | Schlecht — erfordert `–disabled-password`- und `–gecos`-Flags, um Eingabeaufforderungen zu vermeiden |
| Systemkonten | Unterstützt über `-r`-Flag | Unterstützt über `–system`-Flag |
| Gruppenverwaltung | Nur zum Erstellungszeitpunkt | Kann Benutzer nach der Erstellung zu bestehender Gruppe hinzufügen |
| Granularität | Vollständige Kontrolle über jeden Parameter | Meinungsstarke Standardeinstellungen, weniger granular |
Wann useradd verwendet werden sollte
Automatisierung und Infrastructure-as-Code
`useradd` ist die richtige Wahl in jedem nicht-interaktiven Kontext: Ansible-Playbooks, Terraform-Provisioner, Docker-`RUN`-Anweisungen, cloud-init-Skripte und CI/CD-Pipelines. Es erzeugt deterministischen Output ohne stdin-Abhängigkeit.
“`bash
Ansible task equivalent
useradd -m -s /bin/bash -G sudo -c "Deploy User" deployuser
echo "deployuser:$(openssl passwd -6 'securepassword')" | chpasswd
“`
Distributionsübergreifende Portabilität
Jedes Shell-Skript, das sowohl auf Debian-basierten als auch auf RHEL-basierten Systemen ausgeführt werden soll, muss `useradd` verwenden. Das Verlassen auf das Verhalten von `adduser` führt zu stillen Fehlern oder unerwartetem Verhalten auf CentOS, Fedora, Rocky Linux oder Alpine Linux.
System- und Dienstkonten
Das Erstellen gesperrter, nicht-login-fähiger Dienstkonten für Daemons ist eine Spezialität von `useradd`:
“`bash
useradd -r -s /usr/sbin/nologin -d /var/lib/myservice -m myservice
“`
Das Flag `-r` weist eine UID unterhalb der Systemkonto-Schwelle zu, signalisiert Administratoren, dass dies kein menschliches Benutzerkonto ist, und ist das Standardmuster für die Anwendungsbereitstellung in VPS Hosting-Umgebungen, in denen Dienst-Isolation kritisch ist.
Präzise UID/GID-Kontrolle
In NFS-Umgebungen, Container-Orchestrierung oder bei der Synchronisierung von Benutzerdatenbanken über mehrere Server hinweg sind konsistente UIDs und GIDs obligatorisch. `useradd -u 1500 -g 1500` garantiert dies; `adduser` bietet ohne erhebliche Konfiguration nicht dieselbe deterministische Kontrolle.
Wann adduser verwendet werden sollte
Interaktive Server-Einrichtung
Beim manuellen Bereitstellen eines neuen Dedizierten Servers und dem Hinzufügen der ersten menschlichen Benutzerkonten reduziert `adduser` das Risiko einer unvollständigen Einrichtung. Die geführten Eingabeaufforderungen machen es nahezu unmöglich, den Passwortschritt zu vergessen.
Debian/Ubuntu-Umgebungen mit Standardeinstellungen
Wenn Ihre gesamte Infrastruktur auf Debian oder Ubuntu läuft und Sie Standard-Home-Verzeichnis-Benutzer erstellen, liefert `adduser` schneller korrekte Ergebnisse mit weniger zu merkenden Flags.
Gruppenverwaltung nach der Erstellung
Die `adduser username groupname`-Syntax zum Hinzufügen eines bestehenden Benutzers zu einer bestehenden Gruppe ist übersichtlicher als `usermod -aG groupname username`, obwohl beide gültig sind.
Einarbeitung von Junior-Administratoren
Die interaktive Natur von `adduser` macht es zu einem besseren Lehrwerkzeug. Es zeigt die wichtigen Felder (Passwort, vollständiger Name) und verbirgt die Komplexität von UID-Bereichen und Skeleton-Verzeichnissen, bis der Administrator bereit ist, sie zu erlernen.
Kritische Randfälle und Fallstricke
Die fehlende Home-Verzeichnis-Falle
Auf Debian/Ubuntu erstellt das Ausführen von `useradd username` ohne `-m` den Benutzer, aber nicht das Home-Verzeichnis. Der Benutzer kann sich anmelden (sobald ein Passwort gesetzt ist), aber `$HOME` existiert nicht, was zu Fehlern in jeder Anwendung führt, die beim ersten Login in das Home-Verzeichnis schreibt — einschließlich `.bash_history`, `.ssh/authorized_keys` und vieler Anwendungskonfigurationsverzeichnisse.
“`bash
Verify home directory existence after creation
ls -la /home/newuser || echo "Home directory missing — run: mkhomedir_helper newuser"
“`
Shadow-Datei-Sperrung
Beide Befehle sperren `/etc/shadow` während des Schreibens. In Hochparallelitäts-Bereitstellungsskripten, die Dutzende von Benutzern gleichzeitig erstellen, verursacht dies Race Conditions. Verwenden Sie eine Warteschlange oder sequentielle Ausführung beim Massenerstellen von Benutzern.
UID-Kollision in containerisierten Umgebungen
Bei der Bereitstellung von Anwendungen auf VPS mit cPanel oder anderen Control-Panel-Umgebungen verwaltet das Panel selbst die UID-Zuweisung. Das manuelle Ausführen von `useradd` mit einer fest codierten UID kann mit panel-zugewiesenen UIDs kollidieren und Berechtigungsfehler über mehrere Konten hinweg verursachen. Überprüfen Sie immer `getent passwd | awk -F: '{print $3}' | sort -n`, bevor Sie eine UID manuell angeben.
adduser –disabled-password für Skripting
Wenn Sie `adduser` in einem Skript verwenden müssen (zum Beispiel, um seine `/etc/adduser.conf`-Standardeinstellungen zu nutzen), unterdrücken Sie die interaktiven Eingabeaufforderungen:
“`bash
adduser –disabled-password –gecos "Automated User,,," scriptuser
echo "scriptuser:$(openssl passwd -6 'password')" | chpasswd
“`
Das Flag `–gecos` akzeptiert eine kommagetrennte Zeichenkette, die den GECOS-Feldern entspricht, und eliminiert alle interaktiven Eingabeaufforderungen.
PAM- und NSS-Integration
Weder `useradd` noch `adduser` konfiguriert PAM-Module oder NSS (Name Service Switch)-Einträge für LDAP, Active Directory oder andere zentralisierte Authentifizierungssysteme. Auf Servern, die mit `sssd` oder `winbind` integriert sind, erstellt die lokale Benutzererstellung mit beiden Befehlen Konten, die mit Verzeichnisdienstkonten in Konflikt geraten oder von diesen überschrieben werden können. Überprüfen Sie `/etc/nsswitch.conf`, bevor Sie lokale Benutzer auf domänengebundenen Systemen erstellen.
Skeleton-Datei-Anpassung
Beide Befehle kopieren standardmäßig aus `/etc/skel`. Für Teams, die Shared Web Hosting-Umgebungen verwalten, in denen jeder Benutzer ein vorkonfiguriertes `.bashrc`, `.vimrc` oder eine SSH-Konfiguration benötigt, ist das Befüllen von `/etc/skel` vor dem Ausführen eines der beiden Befehle der richtige Ansatz — nicht das Ändern von Dateien nach der Kontoerstellung.
Überprüfung der Benutzererstellung
Unabhängig davon, welchen Befehl Sie verwenden, überprüfen Sie das Ergebnis:
“`bash
Check passwd entry
getent passwd newuser
Check shadow entry (requires root)
getent shadow newuser
Check group memberships
groups newuser
id newuser
Verify home directory and permissions
ls -la /home/newuser
Test login shell
su -s /bin/bash – newuser -c "echo login successful"
“`
Benutzer ändern und löschen
`useradd` und `adduser` erstellen nur Konten. Die Verwaltung nach der Erstellung verwendet andere Befehle:
- `usermod` — Vorhandene Benutzerattribute ändern (Shell, Gruppen, Home-Verzeichnis, Ablauf).
- `userdel` / `deluser` — Konten entfernen. `deluser –remove-home username` auf Debian entfernt auch das Home-Verzeichnis und den Mail-Spool.
- `passwd` — Passwörter setzen oder ändern, Konten sperren/entsperren.
- `chage` — Passwort-Alterungs- und Ablaufrichtlinien verwalten.
“`bash
Lock an account without deleting it
usermod -L username
Unlock
usermod -U username
Force password change on next login
chage -d 0 username
“`
Praktische Entscheidungsmatrix
Verwenden Sie diese Checkliste, um den richtigen Befehl auszuwählen:
- Läuft das Skript auf einem Nicht-Debian-System oder muss es portabel sein? Verwenden Sie `useradd`.
- Handelt es sich um eine automatisierte, nicht-interaktive Umgebung (CI/CD, Ansible, Docker)? Verwenden Sie `useradd`.
- Benötigen Sie eine bestimmte UID/GID für NFS- oder Container-Konsistenz? Verwenden Sie `useradd -u -g`.
- Erstellen Sie ein System-/Dienstkonto ohne Login-Shell? Verwenden Sie `useradd -r -s /usr/sbin/nologin`.
- Sind Sie auf Debian/Ubuntu und erstellen interaktiv ein Standard-Menschenbenutzerkonto? Verwenden Sie `adduser`.
- Möchten Sie einen bestehenden Benutzer mit einem sauberen Einzeiler zu einer Gruppe hinzufügen? Verwenden Sie `adduser username groupname`.
- Schreiben Sie Dokumentation oder schulen Sie Junior-Mitarbeiter auf Debian? Verwenden Sie `adduser`.
- Müssen Sie den Home-Verzeichnisort, den Ablauf oder die Shell nicht-interaktiv im großen Maßstab anpassen? Verwenden Sie `useradd` mit expliziten Flags.
Ordentliche Benutzerkonto-Hygiene ist grundlegend für die Server-Sicherheit. Ob Sie einen einzelnen VPS oder eine Flotte von Dedizierten Servern verwalten — zu verstehen, was jeder Befehl genau auf die Festplatte schreibt und was er ungesetzt lässt, verhindert die Klasse von Privilege-Escalation- und Authentifizierungsfehlern, die aus unvollständiger Kontobereitstellung entstehen.
—
FAQ
Erstellt useradd standardmäßig ein Home-Verzeichnis?
Das hängt von der Distribution ab. Auf Red Hat-basierten Systemen (RHEL, CentOS, Rocky Linux) bewirkt `CREATE_HOME yes` in `/etc/login.defs`, dass `useradd` das Home-Verzeichnis automatisch erstellt. Auf Debian und Ubuntu wird kein Home-Verzeichnis erstellt, es sei denn, Sie übergeben explizit das Flag `-m`.
Ist adduser auf CentOS oder Rocky Linux verfügbar?
Auf RHEL-basierten Distributionen ist `adduser` ein symbolischer Link zu `useradd`, nicht der interaktive Perl-Wrapper, der auf Debian/Ubuntu zu finden ist. Das Ausführen von `adduser username` auf CentOS verhält sich identisch zu `useradd username` — keine Eingabeaufforderungen, kein automatisches Home-Verzeichnis nach Debian-Standardeinstellungen.
Wie verwende ich adduser nicht-interaktiv in einem Skript?
Übergeben Sie `–disabled-password`, um die Passwortabfrage zu überspringen, und `–gecos ""`, um die GECOS-Feld-Eingabeaufforderungen zu überspringen: `adduser –disabled-password –gecos "" username`. Setzen Sie das Passwort anschließend mit `echo "username:password" | chpasswd` oder durch Pipen eines `openssl passwd -6`-Hashes.
Was ist der Unterschied zwischen /etc/login.defs und /etc/adduser.conf?
`/etc/login.defs` ist die systemweite Konfigurationsdatei, die von `useradd`, `userdel` und `usermod` gelesen wird — sie steuert UID/GID-Bereiche, Passwort-Alterungsstandards und das Verhalten bei der Home-Verzeichnis-Erstellung. `/etc/adduser.conf` wird ausschließlich von den Perl-Skripten `adduser` und `deluser` auf Debian-basierten Systemen gelesen und steuert übergeordnete Standardeinstellungen wie die Standard-Shell, den übergeordneten Home-Verzeichnispfad und das Skeleton-Verzeichnis.
Kann ich useradd und adduser sicher auf demselben Debian-Server mischen?
Ja. Beide schreiben letztendlich in dieselben `/etc/passwd`-, `/etc/shadow`- und `/etc/group`-Dateien. Mit beiden Befehlen erstellte Konten sind auf Systemebene nicht zu unterscheiden. Das einzige praktische Problem ist die Konsistenz: Wenn Ihr Team `adduser` interaktiv verwendet und ein Automatisierungsskript `useradd` ohne `-m` verwendet, können einige Benutzer ohne Home-Verzeichnisse enden. Standardisieren Sie auf einen Ansatz pro Umgebung und dokumentieren Sie ihn.
