whileループで渡された定義されたプロパティに対して2つの異なるオブジェクトクラスを解決できる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}
2番目の二重引用符は引用符を終了するため、拡張は引用符で囲まれません。 (引用符は入れ子にできません。)
残りの出力は 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
どの形式規則が許可されているのか覚えていません。
実際にテストしたところ、これは1台のコンピュータでうまく機能します。
$ user=itvirta
$ ldapsearch -xLLL "(&(objectClass=shadowAccount)(uid=$user))"
$ ldapsearch -xLLL '(&(objectClass=shadowAccount)(uid=itvirta))'