Filtros de pesquisa LDAP usando BASH

4

Estou tentando executar a seguinte consulta em um script bash, permitindo-me verificar duas classes de objetos diferentes para um atributo definido passado de um loop while:

#!/bin/bash

inputfile="$1"
binddn="cn=admin,o=services"
password="BLAH"
IFS=','
while read -r Field1 Field2 Field3 Field4 Field5 Field6 ;
do
    ldapsearch -h "'hostname --fqdn'" -p 389 -x -LLL -D "${binddn}" -w "${password}" "'(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute="${Field1}"))'"
done < "$inputfile"
exit 0

Sempre que executo o comando, a variável Field1 passa com sucesso, mas recebo um erro de filtro de pesquisa incorreto:

ldapsearch -h HOSTNAME -p 389 -x -LLL -D cn=admin,o=services -w BLAH ''\''(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute=FIELD1OUTPUT))'\'''
ldapsearch: ldap_search_ext: Bad search filter (87)

Notei que o comando adiciona ('' \ ') ao início e ao final do filtro. Eu corro o comando manualmente menos os carrapatos e barra invertida, a consulta é executada com sucesso. Como isso está sendo adicionado?

Também passei o filtro de pesquisa como uma variável, bem como o comando em si, sem sucesso.

    
por drfunkenstein 04.05.2017 / 20:47

1 resposta

4

Se você fizer isso:

ldapsearch -h ... "'(&(this)(that="${Field1}"))'"

As aspas simples farão parte da string citada, e elas irão para ldapsearch . O que não os espera, dando o erro. Além disso, a expansão de ${Field1} não é citada, uma vez que a segunda aspa dupla termina a citação. (Citações não se aninham).

Sua outra saída se parece com a saída do xtrace do Bash. Ele tenta dizer a você que o argumento realmente contém uma citação literal, mas é difícil ler a citação.

Neste:

''\''(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute=FIELD1OUTPUT))'\'''

temos

''           -- an empty string
\'           -- a literal backslash
'(&(|(...))' -- a quoted string
\'           -- another literal backslash
''           -- another empty string

Eu suspeito que o que você quer é

ldapsearch -h ... "(&(this)(that=\"${Field1}\"))"

com as aspas duplas na string indo para ldapsearch ou

ldapsearch -h ... "(&(this)(that=${Field1}))"

sem eles.

Em qualquer caso, sem as aspas simples ao redor. Não tenho certeza se as aspas duplas devem estar lá, não consigo lembrar qual formato o ldapsearch aceita.

Tanto quanto eu posso testar na prática, isso funciona bem em uma máquina:

$ user=itvirta
$ ldapsearch -xLLL "(&(objectClass=shadowAccount)(uid=$user))" 
$ ldapsearch -xLLL '(&(objectClass=shadowAccount)(uid=itvirta))' 
    
por 04.05.2017 / 21:05