텍스트 파일(한 줄에 하나의 도메인)에서 모든 도메인을 찾고 IP 주소, 공백, 도메인 이름, 공백, 도메인 이름 www가 출력되는 다른 텍스트 파일을 생성하는 방법을 원합니다. 프론트엔드하세요.
예를 들어, 소스 텍스트 파일에 두 줄이 포함되어 있는 경우:
1.gravatar.com
abcya.com
1.gravatar.com에 IPv4 및 IPv6 주소가 모두 있으므로 새 텍스트 파일에는 3줄이 포함됩니다.
72.21.91.121 1.gravatar.com www.1.gravatar.com
2a04:fa87:fffe::c000:4902 1.gravatar.com www.1.gravatar.com
104.198.14.52 abcya.com www.abcya.com
저는 Ubuntu 파생 제품을 실행 중이며 nslookup을 사용하여 IPv4 및 IPv6 주소를 얻을 수 있습니다. 그러나 소스 텍스트 파일은 2,000개가 넘는 도메인을 포함하는 목록이므로 수동으로 수행하면 시간이 오래 걸리고 오류가 발생하기 쉽습니다.
대답이 IP 주소도 허용하지 않는 경우. 도메인이 더 이상 존재하지 않으면(alwaysbeready.mybigcommerce.com의 경우처럼) nslookup은 ** server can't find Alwaysbeready.mybigcommerce.com: NXDOMAIN을 반환합니다. 따라서 결과에서 IP 주소 파일 대신 NXDOMAIN을 사용할 수도 있습니다. 텍스트?
도움을 주실 수 있는 분에게 미리 감사드립니다.
답변1
Python 솔루션
#!/usr/bin/python3
import socket
#this module is core networking module in Python,
#can be used to resolve domain names.
sourcefile = 'sourcefile.txt' #file with domain names
outfile = 'results.txt' #file to write the IP addresses
with open(sourcefile, 'r') as inputf:
#This opens the sourcefile in read mode to see what are the domains
with open(outfile, 'a') as outputf:
#This opens the outfile in append mode to write the results
domains = inputf.readlines()
#This reads all the domains in sourcefile line by line
for domain in domains:
#This for loop will go one by one on domains.
domain = domain.strip("\n")
#as the every domain in the file are in newline,
#the socket function will have trouble, so strip off the newline char
try:
resolution = (socket.getaddrinfo(domain, port=80,type=2))
for ip in resolution:
outputf.write(str(ip[4][0])+" "+domain+ " www."+domain+"\n" )
except:
outputf.write("Could not resolve "+domain+" www."+domain+"\n")
#getaddinfo("domain") gets all the IP addresses.
입력하다:
1.gravatar.com
abcya.com
allaboutbirds.org
google.com
akamai.de
산출:
192.0.73.2 1.gravatar.com www.1.gravatar.com
2a04:fa87:fffe::c000:4902 1.gravatar.com www.1.gravatar.com
104.198.14.52 abcya.com www.abcya.com
128.84.12.109 allaboutbirds.org www.allaboutbirds.org
216.58.197.78 google.com www.google.com
2404:6800:4007:810::200e google.com www.google.com
104.127.218.235 akamai.de www.akamai.de
2600:140b:a000:28e::35eb akamai.de www.akamai.de
2600:140b:a000:280::35eb akamai.de www.akamai.de
답변2
bash
다음 출력을 구문 분석하는 Hacky 솔루션 nslookup
:
#!/bin/bash
get_lines() {
ips=($(nslookup -type=A "$1" | grep -Po -m1 "Address: \K.*"))
ips+=($(nslookup -type=AAAA "$1" | grep -Po -m1 "has AAAA address \K.*"))
if [ ${#ips[@]} -ne 0 ]; then
printf "%s $1 www.$1\n" "${ips[@]}"
else
printf 'NXDOMAIN %s www.%s\n' "$1" "$1"
fi
}
while read domain; do
if [ -z "$domain" ] || [ "${domain:0:1}" = "#" ]; then
# skip empty line and line starting with '#'
continue
fi
get_lines "$domain"
done < "$1"
설명하다:
IPv4의 경우
grep
IP 주소를 다음에 지정합니다.Address:
예:
$ nslookup -type=A 1.gravatar.com Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: 1.gravatar.com Address: 192.0.73.2
IPv6 주소의 경우
grep
IP 주소를 다음에 지정합니다.has AAAA address
예:
$ nslookup -type=AAAA 1.gravatar.com Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: 1.gravatar.com has AAAA address 2a04:fa87:fffe::c000:4902 Authoritative answers can be found from:
IPv4와 IPv6가 모두 실패하면 출력은 입니다
NXDOMAIN domain www.domain
.#
입력 파일의 빈 줄이나 로 시작하는 줄은 건너뜁니다.
산출:
내 테스트 도메인 파일은 다음과 같습니다.
$ cat domains.txt
1.gravatar.com
abcya.com
alwaysbeready.mybigcommerce.com
# this is a comment followed by a newline
allaboutbirds.org
aliceinwonderland.ca
allcancode.com
테스트 실행:
$ ./getips.sh domains.txt
192.0.73.2 1.gravatar.com www.1.gravatar.com
2a04:fa87:fffe::c000:4902 1.gravatar.com www.1.gravatar.com
104.198.14.52 abcya.com www.abcya.com
NXDOMAIN alwaysbeready.mybigcommerce.com www.alwaysbeready.mybigcommerce.com
128.84.12.109 allaboutbirds.org www.allaboutbirds.org
198.168.252.18 aliceinwonderland.ca www.aliceinwonderland.ca
216.239.32.21 allcancode.com www.allcancode.com
2001:4860:4802:32::15 allcancode.com www.allcancode.com
를 사용하여 출력을 디렉터리로 리디렉션할 수 있습니다 ./getips.sh domains.txt > results.txt
.