Linux

讀取文件並將ip地址列印到另一個文件

  • December 24, 2019

我有一個大文件,其中包含 40000 行域名。我想讀取該文件並使用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 名稱,而不是在腳本本身中。

另一個循環。這個從 讀取主機名列表hosts並將每個主機名及其零個或多個 IPv4 地址寫入ips. 我使用製表符 ( \t) 將主機與其 IP 地址列表分開,並且每個 IP 地址都用空格與下一個 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

你說這dig不是要求很好,因為它不是工作的最佳工具。

命令之類的工具host(在許多作業系統的 3 種實現中可用:一種來自 ISC 的 BIND,一種來自 Knot DNS,另一種來自 djbwares)以人類可讀的形式列印資訊,這必須進行繁瑣的後處理如果想要一個簡單的機器可讀列表,可以去除穀殼。

ISCdig和 Knot DNSkdig有一個+short選項,可以改進這一點(以及dig/的普通輸出kdig),但僅限於一次在一個域名上呼叫,需要在 shell 腳本中循環和至少 40,000 個程序來完成這項工作. (這裡的答案之一大約有 160,000 個程序。)

另一個工具是 Daniel J. Bernstein 的dnsipdjbdns 工具集的一部分。您要做的是單行 via xargs,因為該工具可以採用多個域名參數:

%**貓 domain_names.list**
unix.stackexchange.com
freebsd.org
cr.yp.to
%
% **xargs dnsip < domain_names.list**
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當人們想要使用非完全限定域名時,有一個工具:

%**貓 domain_names.list**
Unix
freebsd
加密貨幣
%
% **xargs dnsipq < domain_names.list**
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/questions/558611