단일 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
루프와 두 가지 변경 사항을 더 쉽게 볼 수 있도록 스크립트 형식을 약간 변경했습니다. 두 번째 루프는 echo
(stdout으로) 하나의 명령문만 실행하므로 거기에서 stderr를 리디렉션할 필요가 없습니다.