83 lines
4.3 KiB
Markdown
83 lines
4.3 KiB
Markdown
# Choisir entre `adduser` et `useradd`
|
|
|
|
Sur un système Linux, deux commandes permettent d'ajouter un utilisateur : `useradd` et `adduser`. Elles se ressemblent, mais ne jouent pas dans la même catégorie — et les confondre mène vite à des comptes mal configurés.
|
|
|
|
## Deux outils, deux philosophies
|
|
|
|
`useradd` est un utilitaire **bas niveau**, présent sur toutes les distributions Linux. Il fait exactement ce qu'on lui demande, ni plus ni moins : sans options, il se contente d'ajouter une entrée minimale dans `/etc/passwd`, sans créer de home ni copier le squelette par défaut.
|
|
|
|
`adduser`, à l'inverse, est un **frontend interactif** propre à Debian, Ubuntu et leurs dérivées. Il s'appuie sur `useradd` en coulisses, mais applique les conventions de la distribution (UID dans la bonne plage, copie de `/etc/skel`, groupes par défaut lus dans `/etc/adduser.conf`, etc.).
|
|
|
|
> ⚠️ Piège classique : sur Alpine, `adduser` existe aussi, mais c'est la version BusyBox, dont la syntaxe et le comportement diffèrent du `adduser` Debian. Même nom, autre outil.
|
|
|
|
| Aspect | `useradd` | `adduser` (Debian) |
|
|
|---|---|---|
|
|
| Niveau | Bas niveau, non interactif | Haut niveau, interactif |
|
|
| Répertoire home | Créé uniquement avec `-m` | Créé automatiquement |
|
|
| Squelette `/etc/skel` | Copié uniquement avec `-m` | Copié systématiquement |
|
|
| Mot de passe | À définir séparément (`passwd`) | Demandé à la volée |
|
|
| Groupes par défaut | Aucun en dehors du groupe principal | Lus dans `/etc/adduser.conf` |
|
|
| Disponibilité | Universel | Debian/Ubuntu uniquement |
|
|
|
|
En résumé : `adduser` est pratique pour une création manuelle sur un poste Debian ; `useradd` est l'outil de choix pour les scripts et les environnements portables.
|
|
|
|
## Exemple : reproduire `adduser` avec `useradd`
|
|
|
|
Voici un script Bash qui encapsule `useradd` pour offrir une ergonomie proche d'`adduser`, tout en restant portable. Il ne réimplémente pas tout (pas de lecture de `/etc/adduser.conf`, pas de validation `NAME_REGEX`, pas de gestion fine des plages d'UID), mais il couvre le cas le plus courant.
|
|
|
|
> 🔒 **À lire avant l'exemple :** passer un mot de passe en clair en argument le rend visible dans l'historique shell et dans `ps`. L'exemple ci-dessous est pédagogique. En production, préférez `chpasswd -e` avec un hash, ou laissez `passwd` demander le mot de passe interactivement.
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
NC='\033[0m'
|
|
|
|
print_error() { echo -e "${RED}[ERROR] $1${NC}"; }
|
|
print_info() { echo -e "${YELLOW}[INFO] $1${NC}"; }
|
|
print_success() { echo -e "${GREEN}[SUCCESS] $1${NC}"; }
|
|
|
|
add_user() {
|
|
local username=$1
|
|
local realname=$2
|
|
local password=$3
|
|
local homedir=$4
|
|
local shell=$5
|
|
local groups=$6
|
|
|
|
if id -u "$username" >/dev/null 2>&1; then
|
|
print_error "L'utilisateur $username existe déjà."
|
|
return 1
|
|
fi
|
|
|
|
# -m crée le home et copie /etc/skel ; -U crée un groupe homonyme
|
|
useradd -c "$realname" -d "$homedir" -s "$shell" -G "$groups" -m -U "$username" || {
|
|
print_error "Échec de la création de $username."
|
|
return 1
|
|
}
|
|
|
|
if [ -n "$password" ]; then
|
|
echo "$username:$password" | chpasswd
|
|
fi
|
|
|
|
print_success "L'utilisateur $username a été ajouté avec succès."
|
|
}
|
|
```
|
|
|
|
La fonction prend les mêmes arguments qu'`adduser` : nom d'utilisateur, nom réel, mot de passe, répertoire home, shell et groupes supplémentaires. Elle vérifie d'abord l'absence du compte, délègue ensuite à `useradd -m -U` la création du home (avec copie de `/etc/skel`) et du groupe principal, puis applique le mot de passe via `chpasswd`.
|
|
|
|
Exemple d'appel :
|
|
|
|
```bash
|
|
add_user "jdoe" "John Doe" "password" "/home/jdoe" "/bin/bash" "sudo,www-data"
|
|
```
|
|
|
|
## En pratique
|
|
|
|
- **Administration manuelle sur Debian/Ubuntu** : `adduser`, sans hésiter.
|
|
- **Scripts d'automatisation, Ansible, conteneurs, distributions non-Debian** : `useradd`, qui garantit un comportement identique partout.
|
|
- **Suppression** : la même logique s'applique en miroir. `deluser` est le pendant Debian d'`adduser` ; `userdel` est l'outil bas niveau universel.
|
|
|
|
Connaître la différence évite les mauvaises surprises : un home manquant parce qu'on a oublié `-m`, un script qui passe en local et casse sur un serveur Alpine, ou un compte créé sans le groupe attendu parce qu'on supposait que `useradd` lirait `/etc/adduser.conf` — ce qu'il ne fait pas. |