누수 점검 결과 이런 결과가 나왔습니다. "잘못된" 결과를 올바르게 제외하고 bash를 사용하여 이메일을 계속 포함하는 방법
[email protected]
{"success":false,"error":"Not found"}
[email protected]
{"success":false,"error":"Not found"}
[email protected]
{"success":false,"error":"Not found"}
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}]}
[email protected]
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}]}
이는 bash
다음 스크립트에 의해 생성됩니다.
#!/bin/bash
for i in $(cat $emails):
do echo $i; curl -s "https://leakcheck.io/api/public?key=<api-key>&check=$i"; echo; sleep 0.5; echo;
done
답변1
주소를 출력하고 API를 쿼리하는 대신 호출이 성공한 경우에만 API 호출의 주소와 결과가 출력됩니다.
#!/bin/bash
while IFS= read -r addr; do
reply=(
curl --silent \
--url-query key='<api-key>' \
--url-query check="$addr" \
'https://leakcheck.io/api/public'
)
if jq -e '.success' <<<"$reply"; then
printf 'Address "%s":\n%s\n' "$addr" "$reply"
fi
done <"$emails"
그러면 표시된 파일에서 주소를 하나씩 읽고 $emails
각 주소로 API를 쿼리합니다. 반환된 JSON 문서에 false가 아니고 null이 아닌 값을 가진 최상위 키가 포함되어 있는 경우 success
API의 주소와 응답이 인쇄됩니다. 성공적인 테스트는 jq -e
표현식에서 마지막으로 평가된 값에 따라 달라지는 값으로 종료되는 를 사용하여 수행됩니다 jq
( .success
이 경우).
API 엔드포인트에 대한 액세스 권한이 없으므로 이 코드는 테스트되지 않았습니다.
호출 jq
은 다음과 같이 작성할 수도 있습니다.
jq -e -n --argjson reply "$reply" '$reply.success'
... 더 이상 비표준 "here-string" 리디렉션 에 의존하지 않으므로 /bin/sh
대신 스크립트를 실행할 수 있습니다 .bash
<<<
데이터를 추가로 처리하려면 주소를 JSON에 병합해야 할 수도 있습니다(다소 이상하게도 이 주소는 아직 API 응답의 일부가 아닙니다). JSON을 처리하는 것은 텍스트와 구조화된 JSON 개체를 혼합하여 처리하는 것보다 쉽고 안전합니다.
#!/bin/sh
while IFS= read -r addr; do
reply=(
curl --silent \
--url-query key='<api-key>' \
--url-query check="$addr" \
'https://leakcheck.io/api/public'
)
jq -n \
--arg addr "$addr" \
--argjson reply "$reply" \
'$reply | select(.success) | .address = $addr'
done <"$emails"
이제 주소를 출력하기 위해 쉘을 사용할 필요가 없으므로 더 이상 이 if
명령문이 필요하지 않습니다. 대신 select()
성공하면 응답에서 항목을 가져오고 키를 사용하여 개체에 주소를 추가합니다 address
. 이는 실패한 응답에 대한 출력이 없음을 의미합니다.
스크립트의 마지막 변형의 출력 예는 다음과 같습니다.
{
"success": true,
"found": 1,
"passwords": 1,
"sources": [
{
"name": "LinkedIn.com",
"date": "2012-05"
}
],
"address": "[email protected]"
}
{
"success": true,
"found": 1,
"passwords": 1,
"sources": [
{
"name": "LinkedIn.com",
"date": "2011-05"
}
],
"address": "[email protected]"
}
예쁜 JSON을 출력으로 인쇄하지 않으려면 jq
다음 옵션을 사용하세요.-c
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2012-05"}],"address":"[email protected]"}
{"success":true,"found":1,"passwords":1,"sources":[{"name":"LinkedIn.com","date":"2011-05"}],"address":"[email protected]"}
답변2
아마도 grep "true"
이것은 true를 포함하는 모든 행을 표시할 것입니다. 이론적으로는 간단히 bash 스크립트에 추가할 수도 있습니다.