나는 한동안 많은 진전을 이루지 못한 채 노력해 왔기 때문에 이것은 내 현재 능력을 넘어서는 것 같습니다.
이러한 서버를 검사할 수 있도록 보안 목적으로 호스트 및 IP 목록을 확보하라는 요청을 받았습니다. hosts.linux
서버에는 모든 호스트 이름이 포함된 호스트 목록이 있고 IP는 없습니다. 나는 이 파일에서 이러한 이름을 가져온 다음 명령(예: host
IP를 가져오는 명령)을 실행하는 스크립트를 작성하려고 합니다 .
이 명령은 예를 들어 작동합니다.
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 번호 목록을 추가합니다.