我每次都运行一个循环来查询 ldap 服务器的单个 dn,只是为了看看它是否运行正常。我想将成功和不成功的响应输出到一个文件,虽然前者有效,但后者只是被转储到屏幕上,我不明白为什么。这是我的代码:
#!/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 的消息正在打印到 stderr 流,这不是之前被抓到的| 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
我对脚本进行了一些重新格式化,以便更容易地看到循环和两个更改。由于第二个循环仅运行一个echo
语句(到 stdout),因此无需在那里重定向 stderr。