2009-09-24 9 views
1

J'utilise ldapsearch pour obtenir des utilisateurs de mon serveur LDAP. La commande répond quelque chose comme ceci:stdout à variable. avec mktmp, sed, grep, etc. ligne par ligne

uid: name.surname 
homeDirectory: /home/name 
sambaSID: S-1-4-32-224545876-87201423761-4821562975-6853 
sambaHomeDrive: G: 
description: poI 
description: pPI 
sn: naut 
givenName: givenName: peter 
mail: [email protected] 

Maintenant, je veux attribuer à chaque chaîne après « : » à une variable (les deux descriptions peut-être à un tableau par sambaSID J'ai juste besoin le dernier bloc (6853 dans ce cas? [pourrait être plus ou moins]).

Toute aide serait vraiment apprécié. ici, mon essayer avec mktmp, sed, grep et beaucoup laid si les déclarations. Je n'ai pas d'autre idée ... http://dpaste.com/97693/

Répondre

0

ma contribution qui considère les clés multiples (comme la description) et ajoute la valeur correspondante (séparée par des sauts de ligne)

Vous pouvez utiliser keys comme ${keys[@]} dans votre commande ldapsearch au lieu de $OUTPUT.

Je préfère utiliser des tableaux associatifs, mais ils ont été introduits pas avant bash 4.0. J'utilise donc des tableaux pour les clés et les valeurs et j'ai besoin d'une fonction pour vérifier si une clé existe.

... 

keys=(uid homeDirectory sambaSID sambaHomeDrive description sn givenName mail) 
declare -a values 
i=0 

... 

index() { 
    for ((x=0; x < ${#keys[@]}; x++)); do 
     if [ "$1" == "${keys[$x]}" ]; then 
      echo $x; return 
     fi 
    done 
    echo -1 
} 

exec 5<> $LDIF 
while read <&5 LINE 
do 
    key="${LINE%%:*}" 
    value="${LINE#$key: }" 
    x=`index $key` 
    [ "$x" == -1 ] && x=$((i++)) || v="${values[$x]}" 
    [ "$key" == "sambaSID" ] && value="${value##*-}" 
    values[$x]="${v:+$v 
}$value" 
done 

for ((x=0; x < ${#keys[@]}; x++)); do 
    echo "${keys[$x]}: ${values[$x]}" 
done 

echo "Mail is ${values[`index 'mail'`]}." 
0

Merci pour votre aide. :)

La solution d'andre-r l'adapte le mieux. Mais a un problème. Voici la sortie du script:

script.sh: ligne 29: [: ==: opérateur unaire attendu uid: uid = name.surname, ou = utilisateurs, dc = smb, dc = chname.surname homeDirectory : sambaSID: 8426 sambaHomeDrive: G: Description: p9o sn: martheus givenName: Nom mail: [email protected]

Ainsi, le uid n'est pas juste et sambaHomeDrive n'est pas résolu. Je ne peux pas le réparer. :/

Mais merci beaucoup pour votre aide!

+0

Désolé, mon mauvais. J'ai mis à jour la réponse. C'est toujours une bonne idée d'inclure des variables dans "". –

+0

n'a pas fonctionné. mais merci beaucoup pour votre aide :) uid est uid = nom.nom, ou = Utilisateurs, dc = aksa, dc = nomhomme.nom. Le courrier est [email protected] homeRépertoire est. –

+0

Pouvez-vous coller ce code, s'il vous plaît, qui n'a pas fonctionné? –

0

Si vous ne se soucient vraiment des clés en double, et en supposant que tout à la gauche du premier « : » est alphanumérique et rien à droite contient une seule citation, ce qui suit fera:

 
while read line; do 
    eval $(echo "$line" | sed 's/^\([^:]\+\):[ ]\+\(.*\)/\1='"'"'\2'"'/") 
done 

echo "uid is $uid, home directory is $homeDirectory." 

Si vous avez vraiment besoin de conserver les clés en double, il ne serait pas trop difficile de le modifier pour le supporter. Bien sûr, "eval" peut être dangereux, comme cela a déjà été souligné, mais si les hypothèses ci-dessus sont vérifiées (pas de guillemets simples à droite de ":"), cette utilisation est sûre.

1

C'est tellement plus simple que si vous avez bash, ce que vous faites probablement. À ce stade, toutes les conditions sont remplies et vous avez des variables locales nommées après chaque attribut ldiff. Cela ne fait pas une bonne idée.