누수검사 출력에서 ​​성공한 값만 선택하는 방법은 무엇인가요?

누수검사 출력에서 ​​성공한 값만 선택하는 방법은 무엇인가요?

누수 점검 결과 이런 결과가 나왔습니다. "잘못된" 결과를 올바르게 제외하고 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이 아닌 값을 가진 최상위 키가 포함되어 있는 경우 successAPI의 주소와 응답이 인쇄됩니다. 성공적인 테스트는 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 스크립트에 추가할 수도 있습니다.

관련 정보