BASH의 LDAP 검색 필터 사용

BASH의 LDAP 검색 필터 사용

while 루프에서 전달된 정의된 속성에 대해 서로 다른 두 개체 클래스를 확인할 수 있는 bash 스크립트에서 다음 쿼리를 실행하려고 합니다.

#!/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

명령을 실행할 때마다 Field1 변수가 성공적으로 전달되지만 잘못된 검색 필터 오류가 발생합니다.

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)

나는 이 명령이 필터의 시작과 끝에 (''\')를 추가한다는 것을 알았습니다. 틱과 백슬래시를 제외한 명령을 수동으로 실행했고 쿼리가 성공적으로 실행되었습니다. 이건 어떻게 추가됐나요?

또한 검색 필터를 변수로 전달하고 명령 자체도 성공하지 못했습니다.

답변1

이렇게 하면:

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

작은따옴표는 인용된 문자열의 일부가 되며 로 이동합니다 ldapsearch. 이는 예상하지 못한 결과로 오류가 발생합니다. 또한 ${Field1}두 번째 큰따옴표가 따옴표를 끝내기 때문에 확장은 따옴표로 묶이지 않습니다. (따옴표는 중첩될 수 없습니다.)

나머지 출력은 Bash의 xtrace 출력과 유사합니다. 매개변수에 실제로 리터럴 참조가 포함되어 있음을 알려 주려고 하지만 참조를 읽기가 꽤 어렵습니다.

여기:

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

우리는

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

나는 당신이 원하는 것이 무엇인지 의심합니다

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

문자열의 큰따옴표는 ldapsearch, 또는

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

그들없이.

어쨌든 주변에 작은 따옴표가 없습니다. 큰따옴표가 있어야 하는지 잘 모르겠고 ldapsearch어떤 형식 규칙이 허용되는지 기억이 나지 않습니다.

실제로 테스트한 바에 따르면 이는 한 컴퓨터에서 잘 작동합니다.

$ user=itvirta
$ ldapsearch -xLLL "(&(objectClass=shadowAccount)(uid=$user))" 
$ ldapsearch -xLLL '(&(objectClass=shadowAccount)(uid=itvirta))' 

관련 정보