PTR 레코드 및 도메인+TLD 일치로 grep

PTR 레코드 및 도메인+TLD 일치로 grep

hostIP 명령을 실행한 후 목록에 도메인+TLD가 있는지 확인하려고 합니다.

내 스크립트는 다음과 같습니다

while read ip; do
  PTR=$(host $ip | rev | cut -d" " -f1 | rev | sed 's/\.$//')
  if grep -q "$PTR" list.txt
  then
    echo "Match in list"
  else
    echo "No match in list"
  fi
done <ips.txt

내용은 다음 list.txt과 같습니다.

dns.google
shodan.io

8.8.8.8에 대한 스크립트를 실행하면 다음이 반환됩니다.구글 도메인스크립트가 예상대로 작동합니다. 198.20.99.130에 대해 실행하면 결과가 다음과 같기 때문에 실패합니다(일치 없음).인구 조사 4.shodan.io.

grep대회에 참가할 수 있는 방법이 있나요 ?오직목록에 도메인 이름 + TLD(이 경우 shodan.io)가 있습니까?

하지만인구 조사 4.shodan.io이와 같은 도메인인 list.txt와 일치해야 합니다.shodan.io.example.net그래서는 안됩니다.

답변1

전체 문자열 일치 대신 부분 정규식을 수행하기 때문에 기존 명령이 실패합니다. 또한 매우 느리고 이식성이 없습니다.

대신 이렇게 하세요:

< ips.txt xargs -n 1 host |
awk '
    NR==FNR { list[$0]; next }
    {
        n = split($NF,f,/[.]/)
        domtld = f[n-2] "." f[n-1]
        print (domtld in list ? "Match" : "No match"), "in list"
    }
' list.txt -
Match in list
Match in list

위의 코드는 더 빠르게 실행되고 더 강력하며 다양한 다른 명령에 대한 여러 파이프가 있는 셸 루프에 비해 이식성이 뛰어납니다. 한 번에 한 줄씩 xargs호출하고 (따라서 루프를 작성할 필요가 없음) 출력을 단일 스크립트로 파이프하는 데 사용됩니다 . 스크립트 는 시작 시 한 번 읽고(루프 + grep 솔루션처럼 도메인당 한 번 대신) 이름이 지정된 배열에 값을 저장한 다음 한 번에 한 줄씩 출력을 가져오고 도메인 + tld를 격리하고 해시를 사용합니다. 원하는 출력을 인쇄하기 위해 배열에 있는지 확인하십시오 . 부분 일치나 기존 명령과 같은 정규식 메타 문자에 대해 걱정할 필요가 없습니다. 모든 것이 완전한 리터럴 문자열과 함께 작동합니다.hostlist.txtawkawklist.txtlist[]hostlistgrep

관련 정보