호스트 이름 목록에서 IP를 가져와 단일 파일로 병합하는 스크립트/명령

호스트 이름 목록에서 IP를 가져와 단일 파일로 병합하는 스크립트/명령

나는 한동안 많은 진전을 이루지 못한 채 노력해 왔기 때문에 이것은 내 현재 능력을 넘어서는 것 같습니다.

이러한 서버를 검사할 수 있도록 보안 목적으로 호스트 및 IP 목록을 확보하라는 요청을 받았습니다. hosts.linux서버에는 모든 호스트 이름이 포함된 호스트 목록이 있고 IP는 없습니다. 나는 이 파일에서 이러한 이름을 가져온 다음 명령(예: hostIP를 가져오는 명령)을 실행하는 스크립트를 작성하려고 합니다 .

이 명령은 예를 들어 작동합니다.

host csx-svc-spls-06 | awk '{ print $3 }'

해당 서버의 IP만 반환합니다. 파일에서 읽고 명령을 실행한 다음 서버 이름과 IP 주소를 한 줄씩 새 파일로 내보낼 수 있습니까?

답변1

dig 대신 nslookup을 사용하면 어떤 의미가 있는지 잘 모르겠지만 다음과 같이 하면 효과가 있을 것 같습니다.

while IFS= read -r i; do 
    nslookup "$i" | grep '^Name' -A1 | 
        awk '{print $2}' 
    echo
done < linux.hosts > outputfile

답변2

dig+short생성하도록 하는 옵션이 있습니다.오직생성된 IP 주소, 그 이상은 아닙니다.


이 코드는:

for h in google.com yahoo.com notfound.nosuch; do
  printf '%s = ' "$h"
  printf '%s' "$(dig +short "$h")" | tr '\n' ,
  echo
done

출력을 생성합니다.

google.com = 108.177.112.102,108.177.112.139,108.177.112.101,108.177.112.138,108.177.112.100,108.177.112.113
yahoo.com = 98.138.252.38,98.139.180.180,206.190.39.42
notfound.nosuch = 

이에 비해 이 코드는 다음과 같습니다.

for h in google.com yahoo.com notfound.nosuch; do
  printf "$h = %s\\n" $(dig +short "$h")
done

출력을 생성합니다.

google.com = 108.177.112.138
google.com = 108.177.112.100
google.com = 108.177.112.101
google.com = 108.177.112.113
google.com = 108.177.112.139
google.com = 108.177.112.102
yahoo.com = 98.139.180.180
yahoo.com = 206.190.39.42
yahoo.com = 98.138.252.38
notfound.nosuch = 

파일에서 호스트 이름을 읽으려면 for위 스니펫의 행을 다음으로 바꾸십시오 for h in $(cat hostlist.txt); do. 단, 일부 입력 유효성 검사를 추가할 수도 있습니다. 당신한테 달렸습니다.


골라보세요. 다른 형식을 원하시면 댓글 주세요.


참고: 만약모두원하는 것은 IP 주소이고 출력에 호스트 이름이 포함되어 있는지 상관하지 않습니다.모두당신에게 필요한 것은:

dig +short $(cat hostlist.txt)

그러나 DNS에 나타나지 않는 호스트 이름은 이 명령에 의해 무시된다는 점을 명심하십시오.

답변3

단일 호스트에서 사용할 명령을 사용하여 목록을 반복하면 됩니다(호스트 이름 자체를 포함하도록 약간 수정됨).

while read h; do
    host "$h" | awk '{ print $1, $3 }'
done <linux.hosts >outputfile.txt

에서 읽어서 linux.hosts각 항목에 적용 host하고 명령을 내린 awk후 결과를 에 저장합니다 outputfile.txt.

또는 원할 경우 한 줄로 작성합니다.

while read h; do host "$h" | awk '{ print $1, $3 }'; done <linux.hosts >outputfile.txt

다음은 호스트 이름 별칭과 여러 IP 주소를 고려하고 제공된 파일의 각 입력 줄에 대해 한 줄의 출력을 생성하는 보다 일반적인 접근 방식입니다.

주어진 의 호스트 목록 hostnames.txt입니다.

www.uu.se
www.kth.se
www.su.se

그런 다음 짧은 awk스크립트( script.awk)가 주어지면,

/^;/ || NF == 0 { next }

$4 == "CNAME"   { cn[$5] = (cn[$5] ? cn[$5] "," $1 : $1) }
$4 == "A"       { ip[$1] = (ip[$1] ? ip[$1] "," $5 : $5) }

END {
    for (i in ip) {
        if (cn[i])
            printf("%s (%s) = ", i, cn[i])
        else
            printf("%s = ", i)

        print ip[i]
    }
}

명령 bash

dig +noall +answer -f hostnames.txt | awk -f script.awk

생산할 것입니다

su.se. (www.su.se.) = 193.11.30.171
www.kth.se. = 130.237.28.40
live.webb.uu.se. (www.uu.se.) = 130.238.7.135,130.238.7.133,130.238.7.134

이는 호스트 이름 별칭과 여러 IP 주소가 있는 호스트를 고려합니다. 호스트 이름 별칭은 괄호 안의 이름입니다.

명령 dig자체가 출력을 생성합니다.

; <<>> DiG 9.4.2-P2 <<>> www.uu.se +noall +answer
;; global options:  printcmd
www.uu.se.              300     IN      CNAME   live.webb.uu.se.
live.webb.uu.se.        300     IN      A       130.238.7.134
live.webb.uu.se.        300     IN      A       130.238.7.135
live.webb.uu.se.        300     IN      A       130.238.7.133
www.kth.se.             600     IN      A       130.237.28.40
www.su.se.              300     IN      CNAME   su.se.
su.se.                  300     IN      A       193.11.30.171

-f호스트 이름 목록에 대해 일괄 쿼리( )를 수행하여 이를 수행합니다.

이것이 awk코드 분석 및 요약에 관한 것입니다.

스크립트 는 호스트 이름 별칭 항목을 awk감지 CNAME하고 배열의 각 실제 호스트 이름에 대해 쉼표로 구분된 별칭 목록을 저장하며 cn유사한 작업을 수행하여 ip배열의 각 호스트 이름에 대한 IP 주소를 저장합니다.

END블록은 배열의 호스트 이름을 반복 ip하고 별칭이 있는지 확인합니다. 있는 경우 괄호 안에 인쇄됩니다. 그런 다음 줄 끝에 IP 번호 목록을 추가합니다.

관련 정보