!["답변"을 보여주는 파일에 대한 nslookup awk](https://linux55.com/image/134441/%22%EB%8B%B5%EB%B3%80%22%EC%9D%84%20%EB%B3%B4%EC%97%AC%EC%A3%BC%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EB%8C%80%ED%95%9C%20nslookup%20awk.png)
저는 현재 여러 호스트에서 nslookup을 사용한 다음 awk를 사용하여 원하는 행을 테이블에 인쇄하는 스크립트를 실행하고 있습니다. 한 줄은 file1에 인쇄하고 다른 줄은 file2에 인쇄한 다음 paste file1 file2 >> file3
이 테이블을 생성하는 데 사용됩니다.
테이블은 이렇게 생겼어요
Host IP
name 10.10.10.10
name 10.10.10.10
name 10.10.10.10
대부분의 경우 이는 작동합니다. 그러나 어떤 이유에서인지 160개 결과 중 약 20개에는 왼쪽 열에 "답변:"이 표시되고 오른쪽에는 호스트 이름이 표시됩니다. 이와 같이:
Host IP
answer: hostname
이는 결과 전반에 걸쳐 무작위로 나타나며 nslookup에 "답변:"이라는 단어가 어디에도 없어서 스크립트가 예기치 않게 작동하지 않기 때문에 알아낼 수 없습니다.
참조용 스크립트는 다음과 같습니다.
hosts='hosts.list'
filelines=`cat $hosts`
Empty_Containers(){
truncate -s 0 tmp.txt
truncate -s 0 file1
truncate -s 0 file2
}
for h in $filelines ;
do
Empty_Containers
nslookup $h > tmp.txt
if grep -q "NXDOMAIN" tmp.txt
then
cat tmp.txt | awk 'FNR ==4 {print$5}' > file1
echo "Did_Not_Resolve" > file2
paste file1 file2 >> i.txt
else
cat tmp.txt | awk 'FNR ==4 {print$2}' > file1
cat tmp.txt |awk 'FNR ==5 {print$2}' > file2
paste file1 file2 >> i.txt
fi
cat i.txt | column -t 2 i.txt
done
답변1
원하는 목표가 호스트 이름과 IP 주소 테이블을 만드는 것 뿐이고 이를 사용하는 데 특별히 신경 쓰지 않는 경우 빠른 루프를 사용하여 원하는 출력을 생성 nslookup
할 수 있는 것 같습니다 .for .. echo
for h in $( cat hosts.list ); do
a=$(dig +short $h | head -n1)
echo -e "$h\t${a:-Did_Not_Resolve}"
done
dig
는 보다 스크립트하기 쉬운 DNS 도구입니다 nslookup
. 이 +short
옵션을 사용하면 출력이 더 명확해집니다. 로깅이 없는 요청의 출력은 빈 문자열이므로 내장된 bash
기본 매개변수 확장( ${var:-default}
)을 사용하여 로깅이 없는 경우를 처리하고 "기본" 응답을 제공합니다 Did_Not_Resolve
.
$ dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 20308 IN A 93.184.216.34
;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE rcvd: 60
$ dig +short www.example.com
93.184.216.34
최종 출력은 다음과 같습니다.
www.example.com 93.184.216.34
www.google.com 172.217.14.68
host.doesnotexist.tld Did_Not_Resolve
unix.stackexchange.com 151.101.129.69
또 다른 옵션 dig
은 다음과 같습니다 host
.
$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69
아래 댓글의 질문에 답해 보세요.
내가 사용한 유일한 옵션 은 출력을 지정된 호스트의 IP 주소로 줄이는 것 dig
입니다 +short
. 그렇지 않으면 빈 문자열입니다. 출력을 캡처하여 변수 ("주소"용) 에 할당하기 때문에 dig
하위 쉘( )에서 실행 중입니다. 일부 호스트의 출력을 파이핑하고 있습니다 (예: 호스트가 여러 IP 주소를 반환합니다. 단순화를 위해 첫 번째 주소만 가져옵니다. $( dig [...] )
a
dig
head -n1
unix.stackexchange.com
이를 변수로 끌어내는 이유는 이 문서의 앞부분에서 설명한 대로 간단한 매개변수 확장 트릭을 사용하여 빈 문자열 대신 "분석되지 않은" 텍스트를 제공할 수 있기 때문입니다.
명세서의 요구 사항에 따라 구체적으로 확장합니다 echo
.
echo -e "$h\t${a:-Did_Not_Resolve}"
- 스위치에서 사용하라는 메시지가
-e
표시됩니다 .echo
이자형풍경 순서. 이 경우에는 와 결합하면 문자 그대로의 escape 대신 a가 되는\t
것을 사용하고 있습니다 .-e
Tabt
$h
예상대로 변수의 내용으로 바꾸십시오h
.\t
앞서 설명했듯이 탭이 됩니다.${a:-Did_Not_Resolve}
. 아, 이곳은 마법의 장소다.bash
프로세스의 일부로 매개변수 확장을 수행할 때 몇 가지 자기 성찰을 수행할 수 있습니다. 구문은${var:-default}
변수의 내용으로 확장됩니다.var
또는, 설정되지 않았거나 null인 경우 제공된 대체 항목입니다(이 예에서는default
또는 여기의 실제 사용 사례에서는Did_Not_Resolve
).bash
이에 대한 자세한 내용은 매뉴얼 페이지의 "매개변수 확장" 섹션에서 확인할 수 있습니다 .
최종 결과는 각 줄에 다음 순서로 호스트 이름, a Tab및 주소(있는 경우) 또는 텍스트 (없는 경우) 출력입니다.Did_Not_Resolve