点击或唤醒LDAP记录:如何?

时间:2012-09-08 01:03:36

标签: shell

我不是一位经验丰富的shell脚本编写者,所以我希望得到一些专家的帮助!

我们在循环通过UID的for循环中使用以下命令:

ldapsearch -x -H ldaps://ldap-purple.example.com -b ou=People,dc=example,dc=com uid=jdoe

此命令产生如下记录:

# extended LDIF
#
# LDAPv3
# base <ou=People,dc=example,dc=com> with scope subtree
# filter: uid=jdoe
# requesting: ALL
#

# jdoe, people, example.com
dn: uid=jdoe,ou=people,dc=example,dc=com
cn: John Doe
homeDirectory: /afs/rats.example.com/users/t/jdoe
loginShell: /bin/bash
objectClass: posixAccount
uid: jdoe
uidNumber: 9239
gidNumber: 100002

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

我想做的是能够grep或awk(或其他)然后在同一行生成'cn','uid'和'uidNumber',即

John Doe, jdoe, 9239

然而,我不确定可以使用什么工具来创建它。

先谢谢你的帮助!

干杯,丹

3 个答案:

答案 0 :(得分:2)

是的,使用awk很容易。鉴于你说这是在一个循环中运行,我在一个基本循环的解决方案中草绘,这可能或可能不匹配你正在做的事情。希望您能看到如何适应您的确切需求。

while read ou dc1 dc2 uid ; do
    dapsearch -x -H ldaps://ldap-purple.example.com -b ou="$ou",dc1="$dc1",dc="$dc2" uid="$uid" \
    | gawk -F":" '
        $1=="cn" { cn = $2; sub(/^  */,"", cn); next}
        $1=="uid" { uid = $2; sub(/^  */,"", uid);next}
        $1=="uidNumber" { uidNumber = $2; sub(/^  */,"", uidNumber );next}

        # ... etc
        END {
           printf("%s,%s,%s\n", cn,uid,uidNumber)
        }           
    '
done < /path/to/ldap_lookup.lst

<强>输出

John Doe,jdoe,9239

(使用上面的样本记录作为输入)

如果出于某种原因需要记录中的前导空格,请取出sub() cmds。

我没有ldapsearch来测试。如果你收到错误消息,gawk非常适合显示问题的位置,如果它不是确定问题点的确切位置,那么通常在此之前。将错误消息发布为评论,我会看到我能做些什么。

IHTH

答案 1 :(得分:1)

awk 'BEGIN { RS = "gidNumber: [0-9]+" ; FS = "\n" ; OFS=","}
{ for (i=1;i<=NF;i++) { 
       if ($i ~ "^cn: ") { cn=gensub("^cn: ","","g",$i) }
       if ($i ~ "^uidNumber: ") { uidNum=gensub("^uidNumber: ","","g",$i) }
       if ($i ~ "^uid: ") { uid=gensub("^uid: ","","g",$i) }
      }
  if ( cn > "" && uid > "" && uidNum > "" ) {
       print cn, uid, uidNum
      }
  cn="" ; uid="" ; uidNum=""
}' INPUTFILE

可能会为你工作。 See it in action at ideone.com(我已经添加了一条测试记录)。

答案 2 :(得分:1)

感谢您的回答,我会尝试所有这些!

在我看到你的回复之前,我一起废弃了以下内容,虽然丑陋但是诀窍:

ldapsearch -x -H ldaps://ldap-purple.example.com -b ou=People,dc=example,dc=com uid=$i | awk -F': ' '/uid:/ {ORS=",";print $2} /uidNumber/ {ORS="\n";print $2} /cn/ {ORS=",";split ($2,fields,"-"); print fields[1]}'