40,000줄의 도메인 이름이 포함된 대용량 파일이 있습니다. 해당 파일을 읽고 dig
(또는 다른 수단을 사용하여) DNS에서 도메인의 IP 주소를 조회하고 이를 다른 파일에 인쇄하고 싶습니다.
어떻게 해야 하나요?
편집: 제안된 솔루션 중 일부를 사용하여 이를 테스트했습니다. 대부분은 다음과 같습니다.
#!/bin/bash
> ips.txt
cat test.txt | while read host; do
ip=$(getent hosts "$host")
if [ $? -ne 0 ]; then
echo "Host $host was not resolved.";
continue
fi
ip=$(echo "$ip" | awk '{ print $1 }')
echo "Host: $host, IP: $ip" >> ips.txt
done
그러면 빈 파일이 생성됩니다. 왜 이것이 작동하지 않는지 잘 모르겠습니다.
나는 다른 해결책을 시도했습니다.
for host in 0.accountkit.com 0.bigclicker.me 0.cdn.ddstatic.com 0.facebook.com 0.fls.doubleclick.net 0.hiveon.net 0.mining.garden
do
# get ips to host using dig
ips=($(dig "$host" a +short | grep '^[.0-9]*$'))
for ip in "${ips[@]}";
do
printf 'allow\t\t%s\n' "$ip"
done
done > allowedip.txt
그러면 IP 주소가 인쇄되지만 문제는 스크립트 자체가 아닌 파일에서 DNS 이름을 읽어야 한다는 것입니다.
답변1
dig
이것이 작업에 가장 적합한 도구가 아니기 때문에 이것이 요구 사항이 아니라고 말씀해주셔서 기쁩니다 .
명령과 같은 도구 host
(많은 운영 체제에는 세 가지 구현이 있습니다: ISC의 BIND에서 하나, Knot DNS에서 하나, djbwares에서 하나)는 사람이 읽을 수 있는 형식으로 정보를 인쇄하고 지루한 작업을 수행해야 합니다. 목록이 원합니다.
ISC dig
와 Knot DNS에는 이를 개선하는 옵션이 kdig
있지만 ( / 의 일반 출력 +short
도 포함 ) 한 번에 하나의 도메인 이름에서만 호출할 수 있으므로 쉘 스크립트의 루프와 최소 40,000개의 프로세스가 필요합니다. 직업. (여기서 하나의 답변에는 약 160,000개의 프로세스가 있습니다.)dig
kdig
dnsip
또 다른 도구는 djbdns 도구 세트의 일부인 Daniel J. Bernstein의 도구입니다 . xargs
도구가 여러 도메인 이름 매개변수를 사용할 수 있으므로 원하는 작업은 한 줄을 사용하는 것입니다 .
%고양이 도메인 이름.목록 unix.stackexchange.com freebsd.org cr.yp.to % %xargs dnsip <도메인 이름.목록 151.101.65.69 151.101.193.69 151.101.1.69 151.101.129.69 96.47.72.84 131.193.32.109 131.193.32.108 %
이렇게 하면 프로세스 수가 어느 정도 줄어듭니다. (빠른 대략적인 테스트에서는 3배 정도 감소한 것으로 나타났습니다. 40,000개 도메인에 대한 테스트 목록에서는 9개의 dnsip
프로세스만 생성되었습니다.)
dnsipq
정규화되지 않은 도메인 이름을 사용하려는 경우를 위한 도구가 있습니다.
%고양이 도메인 이름.목록 유닉스 무료 소프트웨어 암호화폐 % %xargs dnsipq <도메인 이름.목록 unix.stackexchange.com 151.101.1.69 151.101.193.69 151.101.65.69 151.101.129.69 freebsd.stackexchange.com 151.101.65.69 151.101.193.69 151.101.1.69 151.101.129.69 crypto.stackexchange.com 151.101.1.69 151.101.129.69 151.101.193.69 151.101.65.69 %
추가 읽기
- https://unix.stackexchange.com/a/557555/5132
- 다니엘 J. 번스타인(1999).
dnsip
.DJB웨어. - 다니엘 J. 번스타인(1999).
dnsipq
.DJB웨어. - https://unix.stackexchange.com/a/446293/5132
답변2
또 다른주기. 이 명령은 에서 호스트 이름 목록을 읽고 hosts
각 호스트 이름과 0개 이상의 IPv4 주소를 에 씁니다 ips
. 탭( )을 사용하여 호스트 목록과 IP 주소를 구분하고 \t
각 IP 주소를 다음 주소와 공백으로 구분합니다.
#!/bin/bash
while IFS= read -r host
do
if [[ -n "$host" ]]
then
ips=$(dig +short "$host" | grep '^[[:digit:].]*$' | xargs)
printf "%s\t%s\n" "$host" "$ips"
fi
done <hosts >ips
예시 데이터:
소스 파일hosts
bbc.co.uk
google.co.uk
결과 파일ips
bbc.co.uk 151.101.192.81 151.101.128.81 151.101.64.81 151.101.0.81
google.co.uk 216.58.213.3
답변3
단일 명령줄 또는 작은 bash 스크립트에서:
while IFS= read -r Domainname; do [ -n "$Domainname" ] && echo "$Domainname: $(dig +short "$Domainname" | tr '\n' ' ')"; done < domainlist.csv
domainlist.csv
그러면 도메인 이름이 포함된 파일이 while
루프로 읽혀집니다. 본문은 비어 있지 않은 모든 줄을 출력합니다.
답변4
이는 파일의 각 줄을 가져와서 hosts.txt
호스트에서 DNS 조회를 수행하고 결과 IP 주소(호스트 이름과 함께)를 기록합니다 ips.txt
. 시간을 줄이기 위해 병렬 조회를 수행하지 않으며 유효하지 않은 입력을 처리하지도 않습니다. 그리고 여러 IP 주소를 처리하지 않습니다.
오류의 경우 호스트 이름이 확인되지 않으면 화면에 오류가 인쇄됩니다. ips.txt
이 호스트에는 아무 것도 기록되지 않습니다 .
#!/bin/bash
> ips.txt
cat hosts.txt | while read host; do
ip=$(getent hosts "$host")
if [ $? -ne 0 ]; then
echo "Host $host was not resolved.";
continue
fi
ip=$(echo "$ip" | awk '{ print $1 }')
echo "Host: $host, IP: $ip" >> ips.txt
done