Ldap search script.sh

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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/gidNumber libre, 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