我使用ldapsearch从我的LDAP服务器中获取一些用户。该命令回复如下:
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: mymail@example.com
现在我想将“:”之后的每个字符串分配给一个变量(两个描述可能是一个数组?通过sambaSID我只需要最后一个块(在这种情况下为6853 [可能更长或更短])。
任何帮助都会非常感激。在这里,我尝试使用mktmp,sed,grep和许多丑陋的if语句。我没有其他想法...... http://dpaste.com/97693/
答案 0 :(得分:1)
如果你有bash,它就比你简单得多了。
#!/bin/bash
while read line ; do
n="${line%%:*}"
v="${line#*: }"
eval $n=\"$v\"
done
sambaSID=${sambaSID/*-/}
$ ldapsearch | this_script.sh
此时满足所有要求,并且您具有以每个ldiff属性命名的局部变量。这不是一个好主意。
答案 1 :(得分:0)
我的贡献考虑多个键(如描述)并附加相应的值(以换行符分隔)。
您可以在keys
命令中使用${keys[@]}
作为ldapsearch
,而不是$OUTPUT
。
我宁愿使用关联数组,但是直到bash 4.0才会引入它们。所以我使用数组来获取键和值,并需要一个函数来检查键是否存在。
...
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'`]}."
答案 2 :(得分:0)
感谢您的帮助。 :)
来自andre-r的解决方案最适合。但有一个问题。这是脚本的输出:
script.sh:第29行:[:==:一元运算符预期 uid:uid = name.surname,ou = Users,dc = smb,dc = chname.surname homeDirectory的: sambaSID:8426 sambaHomeDrive:G: 描述:p9o sn:martheus givenName:name mail:myemail@example.com
所以uid不对,sambaHomeDrive没有解决。无法修复它。 :/
但是非常感谢你的帮助!
答案 3 :(得分:0)
如果您不关心重复键,并假设第一个“:”左侧的所有内容都是字母数字,右侧没有任何内容包含单引号,则以下内容将执行:
while read line; do eval $(echo "$line" | sed 's/^\([^:]\+\):[ ]\+\(.*\)/\1='"'"'\2'"'/") done echo "uid is $uid, home directory is $homeDirectory."
如果你真的需要保留重复的密钥,那么修改它来支持它就不会太难。当然,“eval”可能是危险的,因为它已经被指出,但如果上述假设成立(“:”右边没有单引号),这种用法是安全的。