J'ai récemment écrit un bash script qui devait analyser la sortie des résultats de ldapsearch. Le script fonctionne, mais j'imagine qu'il existe un moyen plus efficace d'accomplir cette tâche.
Le script exécute une commande ldapsearch, qui produit plusieurs enregistrements dans un format multiligne. Chaque enregistrement est séparé par une ligne blanche. Ce que j'ai fini par faire est le suivant :
- ajouter un caractère de délimitation à la fin de chaque ligne
- Ajouter la chaîne 'DELIM' aux lignes vides
- rogné toutes les nouvelles lignes
- Remplacement de 'DELIM' par une nouvelle ligne
Cela a pour effet de transformer la sortie multiligne de ldapsearch en plusieurs lignes de valeurs séparées et délimitées. J'utilise ensuite cut deux fois pour analyser les lignes (une fois pour séparer le délimiteur, et une autre fois pour renvoyer la sortie du résultat de ldap).
Voici le code :
while IFS= read -r line ; do
dn=$(echo "$line" | cut -d '#' -f 1 | cut -d " " -f 2)
uid=$(echo "$line" | cut -d '#' -f 2 | cut -d " " -f 2)
uidNumber=$(echo "$line" | cut -d '#' -f 3 | cut -d " " -f 2)
gidNumber=$(echo "$line" | cut -d '#' -f 4 | cut -d " " -f 2)
# Code emitted since it's not relevant
done < <(ldapsearch -x -H "$ldap_server" -D 'cn=Directory Manager' -w $ds_password -b "$searchbase" -LLL uid uidNumber gidNumber | sed 's/$/#/g' | sed 's/^#$/DELIM/g' | tr -d '\n' | sed 's/DELIM/\n/g')
La sortie de la commande ldapsearch est la suivante
dn: uid=userone,ou=People,dc=team,dc=company,dc=local
uid: userone
uidNumber: 5000
gidNumber: 5000
dn: uid=usertwo,ou=People,dc=team,dc=company,dc=local
uid: usertwo
uidNumber: 5001
gidNumber: 5001
Existe-t-il un moyen plus efficace d'y parvenir ? Plus précisément, une méthode qui n'utilise pas autant de tuyaux ?