単一のDNSに対してLDAPサーバーを照会するたびにループを実行して、正しく実行されていることを確認しました。成功と失敗の応答をファイルに出力したい。前者は機能しますが、後者は画面にダンプされ、その理由を理解できません。これは私のコードです。
#!/bin/bash
for i in $(seq 20000); do
ldapsearch -x -LLL -D "cn=manager,ou=ft,o=cudb,c=es" -w normal -h 10.22.127.4 -p 389 -b 'dc=IMSI, ou=identities,ou=ft,o=cudb,c=es'
done | while IFS= read -r line; do echo "[---- PL0 ----] $(date) $line"; done >> search_imsi_$(date '+%Y_%m_%d__%H_%M_%S').log 2>&1
また、ループ内の出力をパイピングしてみましたが(完了した後ではありません)、エラーはまだ画面に印刷されます。問題のエラーは次のとおりです。
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
このエラーの戻り値は 255 です。
これは一般的なエラーのようにリダイレクトされない特別なエラーの一種ですか、それとも何かが欠けていますか?
ベストアンサー1
ldapsearchのメッセージは次のとおりです。標準エラーストリームとして印刷、以前は捕まっていませんでした| while
。
aを使用してリダイレクトしようとした場合は、>
ループ内で機能しない理由を説明できます。
ldapsearchのエラー出力をキャプチャするには、スクリプトを次のように変更します。
#!/bin/bash
for i in $(seq 20000); do
ldapsearch -x -LLL -D "cn=manager,ou=ft,o=cudb,c=es" \
-w normal -h 10.22.127.4 -p 389 \
-b 'dc=IMSI, ou=identities,ou=ft,o=cudb,c=es' 2>&1 ## <-- added "2>&1" here
done | while IFS= read -r line
do
echo "[---- PL0 ----] $(date) $line";
done >> search_imsi_$(date '+%Y_%m_%d__%H_%M_%S').log ## no need for 2>&1 here
ループと2つの変更をより簡単に表示できるように、スクリプト形式を少し変更しました。 2番目のループはecho
(stdoutで)1つのステートメントのみを実行するため、そこからstderrをリダイレクトする必要はありません。