
저는 현재 여러 호스트에서 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
아래 댓글의 질문에 대한 답변:
내가 사용하는 유일한 옵션 dig
은 +short
출력을 지정된 호스트의 IP 주소로 줄이거나 그렇지 않으면 빈 문자열로 줄이는 것입니다. 출력을 캡처하고 이를 변수 ("주소"용) 에 할당하기 때문에 dig
서브셸( )에서 실행합니다 . 일부 호스트(예: 호스트가 여러 IP 주소를 반환하는 경우)를 통해 출력을 파이핑하고 있습니다. 단순화를 위해 첫 번째 주소를 가져옵니다. $( dig [...] )
a
dig
head -n1
unix.stackexchange.com
이것이 변수로 추출되는 이유는 앞서 설명한 대로 간단한 매개변수 확장 트릭을 사용하여 빈 문자열 대신 "해결되지 않음" 텍스트를 제공할 수 있도록 하기 위함입니다.
구체적으로 성명서 에서 요청한 대로 확장합니다 echo
.
echo -e "$h\t${a:-Did_Not_Resolve}"
- 스위치 는 내가 사용할 것이라고
-e
알려줍니다 .echo
이자형풍경 시퀀스. 이 경우에는\t
와 결합하면 문자 그대로 이스케이프-e
되는 것이 Tab아니라 가 되는 것을 사용하고 있습니다t
. $h
는 예상한 대로 단순히 변수의 내용으로 대체됩니다h
.\t
는 앞서 설명한 대로 탭이 됩니다.${a:-Did_Not_Resolve}
. 아, 바로 여기에 마법이 있습니다.bash
매개변수 확장을 수행할 때 프로세스의 일부로 약간의 자기 성찰을 수행할 수 있는 기능이 있습니다. 구문은${var:-default}
변수의 내용으로 확장됩니다.var
또는, 설정되지 않았거나 null인 경우 제공된 대체 항목입니다(이 예의 경우default
; 또는 실제 사용 사례에서는Did_Not_Resolve
). 이에 대한 자세한 내용은bash
매뉴얼 페이지의 "매개변수 확장" 섹션에서 확인할 수 있습니다 .
최종 결과는 각 줄에 다음 순서로 호스트 이름, a Tab및 주소(있는 경우), Did_Not_Resolve
없는 경우 텍스트가 출력됩니다.