Ldap search script.sh
| Fiche express | |
|---|---|
| Domaine | Automatisation de la gestion des comptes LDAP |
| Approche | script shell (getopt) + helpers Perl (Net::LDAP)
|
| Voir aussi | LDAP · Ldapsearch · LDIF |
Historiquement, avant la généralisation d'outils dédiés (scripts ldapscripts,
modules Ansible community.general.ldap_*, ou tout simplement des fichiers
LDIF versionnés), il était courant d'automatiser la gestion des comptes d'un annuaire
LDAP avec un script shell « maison » s'appuyant sur les utilitaires clients
(ldapsearch, ldapadd, ldapdelete) et, pour les
opérations plus complexes (calcul d'UID/GID libres, gestion des attributs Samba...), sur des
scripts Perl utilisant le module Net::LDAP.
Le principe général d'un tel script :
- un parsing d'arguments via
getopt(serveur, port, bind DN, base DN, mode
opératoire : liste/ajout/modification/suppression) ;
- des valeurs par défaut surchargeables par variables d'environnement (serveur, OU des
utilisateurs/groupes/machines, port LDAP...) ;
- des fonctions de calcul du prochain
uidNumber/gidNumberlibre, en
interrogeant l'annuaire existant ;
- la délégation de l'écriture effective dans l'annuaire à un helper Perl (
Net::LDAP)
qui gère la création des différents types de comptes (POSIX simple, Samba, machine...).
Exemple simplifié
Extrait représentatif de la logique (recherche du prochain UID libre puis ajout d'un compte), adapté et généricisé :
#!/bin/bash
# gestion_ldap.sh — squelette illustratif, à adapter
BASEDN="${BASEDN:-ou=exemple,dc=exemple,dc=fr}"
OU_USERS="${OU_USERS:-ou=people}"
BINDDN="${BINDDN:-cn=admin,dc=exemple,dc=fr}"
SERVEUR="${SERVEUR:-localhost}"
PORT="${PORT:-389}"
# Prochain uidNumber libre
new_uid() {
ldapsearch -x -w "$PASSWORD" -D "$BINDDN" -H "ldap://$SERVEUR:$PORT" \
-b "$OU_USERS,$BASEDN" uidNumber \
| awk -F': ' '/^uidNumber/ {print $2}' | sort -n | tail -1
}
UID_LIBRE=$(( $(new_uid) + 1 ))
echo "Prochain UID libre : $UID_LIBRE"
La partie création de compte proprement dite (attributs POSIX, mot de passe, éventuellement
attributs Samba) est ensuite déléguée à un script Perl utilisant Net::LDAP :
#!/usr/bin/perl -w
use Net::LDAP;
my $ldap = Net::LDAP->new($ENV{SERVEUR}) or die "$@";
$ldap->bind($ENV{BINDDN}, password => $ENV{PASSWORD}) or die "$@";
my $dn = "uid=$uid,$ENV{OU_USERS},$ENV{BASEDN}";
my $res = $ldap->add($dn,
attrs => [
objectclass => [qw(inetOrgPerson posixAccount top shadowAccount)],
uid => $uid,
cn => $uid,
sn => $sn,
userPassword => $userpassword,
uidNumber => $uidNumber,
gidNumber => $gidNumber,
homeDirectory => $home_rep,
loginShell => $login_shell,
]);
$res->code && warn "Erreur lors de l'ajout : ", $res->error;
⚠️ Note sur la source d'origine : la page source contenait un script complet (~35 Ko)
avec un en-tête de copyright nominatif et des identifiants d'organisation réels (nom de
domaine LDAP, nom d'hôte de partage Samba). Ces éléments ont été retirés — hors de propos pour
une fiche de doc technique — et le script a été condensé à sa logique essentielle et
généricisé. Pour une gestion moderne des comptes LDAP, préférer un outil maintenu
(LDIF versionné, ldapscripts, ou un module d'automatisation type Ansible)
plutôt qu'un script shell/Perl fait maison difficile à maintenir dans la durée.
Voir aussi
- LDAP — structure d'un annuaire
- Ldapsearch — interroger l'annuaire pour retrouver le prochain UID/GID libre
- LDIF — approche déclarative alternative, plus simple à versionner qu'un script