如何在ldapsearch中检索第一个匹配属性的值?

时间:2016-04-26 17:24:23

标签: bash unix ldap openldap ldap-query

如果我使用命令

ldapsearch -h [HOST] -x -LLL uid=[UID] sn

它会返回

dn: [DN]
sn: [SURNAME]
sn;x-role-2: [SURNAME]

表示具有多个值sn的条目。我有两个问题:

  1. 如何ldapsearch仅返回属性的,即

    [SURNAME]
    [SURNAME]
    
  2. 如何ldapsearch只返回第一个匹配属性 的值,即

    [SURNAME]
    
  3. 我知道我可以使用grepsed进行一些字符串操作来复制所有这些(我已经拥有),但我想知道是否有更高效的内置方式实现这两个目标。

    非常感谢任何帮助!

    编辑:以下是我目前用于完成上述操作的代码:

    ldapsearch -h [HOST] -x -LLL uid=[UID] sn | sed 's/[^:]*: //;2q;d'
    

    sed 's/[^:]*: //;2q;d'首先删除属性名称,然后选择第一个匹配属性的值(位于第二行,因为dn占据了第一行。)

2 个答案:

答案 0 :(得分:2)

虽然来自@Francois的答案可以(部分)起作用,但我还是鼓励您查看LDAP协议规范section 4.1.7,其中

  

属性值集是无序的。实施必须   不依赖于可重复的排序。

换句话说,无法保证哪个值将成为第一个值。如果你不关心你正在采取什么价值,这可能没问题。您还需要考虑是否关心带有标记选项的属性(您的示例显示了这一点)。如果没有标记选项,您的应用程序是否应该使用该值而不是属性值?

如果您的属性值具有特殊字符,则@Francois提供的答案将不起作用(在这种情况下显示的值将是BASE64编码的,并且属性类型后面会有两个冒号 - 另请参阅RFC 2849 )。

您可能需要考虑编写一个小脚本(在Perl上的Python中)来执行您需要的操作而不依赖于可能很难正确使用的shell魔法。

答案 1 :(得分:1)

有些内置确实可以提供帮助:

cut可以根据分隔符(在你的情况下:)拆分每列的输出 head -1将返回输出的第一行。

例如:

  ldapsearch -h [HOST] -x -LLL uid=[UID] sn | cut -d ":" -f 2- 

应该只显示属性值

ldapsearch -h [HOST] -x -LLL uid=[UID] sn | head -1 

应该只返回输出的第一行

您也可以将它们组合在一起:

ldapsearch -h [HOST] -x -LLL uid=[UID] sn | head -1 | cut -d ":" -f 2-

http://linux.die.net/man/1/head

http://linux.die.net/man/1/cut