如何提取活动域

How to extract Active domain

Linux 中是否有 bash command/script 以便我们可以从长列表中提取活动域,

例如,我有一个 csv 文件 (domains.csv) 横向列出了 5500 万个域,我们只需要 csv 文件中的活动域 (active.csv)

这里的活跃是指至少有一个网页的域名,不是过期或未过期的域名。例如 whoisdatacenter.info 没有过期但是没有网页,我们认为它是非活动的。

我检查 google 并堆叠网站。我看到我们可以通过两种方式获得域名。喜欢

$ curl -Is google.com | grep -i location 
Location: http://www.google.com/

or 

nslookup google.com | grep -i name 
Name:   google.com

但我不知道如何在 bash 中为 5500 万个域编写程序。

下面的命令不会给出任何结果,所以我想出 nsloop 和 curl 是获得结果的途径

$ nslookup whoisdatacenter.info | grep -i name 
$ curl -Is whoisdatacenter.info | grep -i location 

第 25 行

$ head -25 domains.csv 

"
"0----0.info"
"0--0---------2lookup.com"
"0--0-------free2lookup.com"
"0--0-----2lookup.com"
"0--0----free2lookup.com"
"0--1.xyz"
"0--123456789.com"
"0--123456789.net"
"0--6.com"
"0--7.com"
"0--9.info"
"0--9.net"
"0--9.world"
"0--a.com"
"0--a.net"
"0--b.com"
"0--m.com"
"0--mm.com"
"0--reversephonelookup.com"
"0--z.com"
"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0.com"
"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0.com"
"0-0-0-0-0-0-0-0-0-0-0-0-0-10-0-0-0-0-0-0-0-0-0-0-0-0-0.info"

代码我是运行

while read line; 
do nslookup "$line" | awk '/Name/'; 
done < domains.csv > active3.csv

我得到的结果

 sh -x ravi2.sh 
+ read line
+ nslookup ''
+ awk /Name/
nslookup: '' is not a legal name (unexpected end of input)
+ read line
+ nslookup '"'
+ awk /Name/
+ read line
+ nslookup '"0----0.info"'
+ awk /Name/
+ read line
+ nslookup '"0--0---------2lookup.com"'
+ awk /Name/
+ read line
+ nslookup '"0--0-------free2lookup.com"'
+ awk /Name/
+ read line
+ nslookup '"0--0-----2lookup.com"'
+ awk /Name/
+ read line
+ nslookup '"0--0----free2lookup.com"'
+ awk /Name/

仍然,active3.csv是空的 以下 。该脚本正在运行,但某些东西阻止了批量查找,无论是在我的主机中还是在其他地方。

while read line
do
nslookup $(echo "$line" | awk '{gsub(/\r/,"");gsub(/.*-|"$/,"")} 1') | awk '/Name/{print}'
done < input.csv >> output.csv

批量 nslookup 在下面显示此类错误

server can't find facebook.com3: NXDOMAIN

[已解决] Ravi 脚本工作得很好,我在我的 MAC 中 运行 给出了 Nslookup 错误,我在 CentOS Linux 服务器上工作,Nslookup 与 Ravi 脚本

配合得很好

非常感谢!!

编辑:请按照 OP 显示的示例尝试我的编辑解决方案。

while read line
do
   nslookup $(echo "$line" | awk '{gsub(/\r/,"");gsub(/.*-|"$/,"")} 1') | awk '/Name/{found=1;next} found && /Address/{print $NF}'
done < "Input_file"


能否请您尝试关注。

OP 在她的 Input_file 中有控制 M 字符,所以 运行 下面的命令也先删除它们:

tr -d '\r' < Input_file > temp && mv temp Input_file

然后运行下面的代码:

while read line
do
   nslookup "$line" | awk '/Name/{found=1;next} found && /Address/{print $NF}'
done < "Input_file"

我假设由于您传递的是域名,因此您需要在输出中获取他们的地址(IP 地址)。此外,由于您使用的是巨大的 Input_file,因此提供输出可能会有点慢,但请相信我,这是一种更简单的方法。

nslookup只是表示该域名在DNS中是否有记录。拥有一个或多个 IP 地址并不自动意味着您拥有一个网站;许多 IP 地址被分配用于完全不同的目的(但可能巧合地托管一个完全用于另一个域名的网站!)

(此外,nslookup 对脚本编写不是特别友好;您需要查看 dig 而不是自动化。)

没有简单的方法可以在短时间内访问 5500 万个可能的网站,如果您愿意,可能不应该使用 Bash。参见例如https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html 基于 Python.

的各种方法的阐述

立即出现的错误信息表明您的输入文件中有 DOS 回车 returns;这是一个常见的常见问题解答,在

中有很好的介绍

您可以 运行 多个 curl 并行实例,但您最终可能会使您的网络饱和 - 尝试不同程度的并行性 - 可能将您的文件分成更小的部分并且 运行 每个部分都在一个单独的主机上,具有单独的网络连接(可能在云中),但为了快速演示,

tr -d '\r' <file |
xargs -P 256 -i sh -c 'curl -Is {} | grep Location'

到 运行 256 个 curl 并行实例。您仍然需要弄清楚哪个输出对应于哪个输入,因此可能重构为

tr -d '\r' <file |
xargs -P 256 -i sh -c 'curl -Is {} | sed -n "s/Location/{}:&/p"'

在每个输出前打印输入的域名。

(也许还要注意,只是一个域名不是完整的 URL。curl 将有助于尝试在前面添加一个 "http://" 然后连接到那个,但是如果域只有 "https://" 网站并且没有来自 http:// 的重定向,仍然无法为您提供准确的结果。)

如果您在 Mac 上,其中 xargs 不理解 -i,请尝试 -I {} 或类似

tr -d '\r' <file |
xargs -P 256 sh -c 'for url; do curl -Is "$url" | sed -n "s/Location/{}:&/p"; done' _

示例假设您还没有一劳永逸地修复 DOS 回车 returns;你可能真的应该(并考虑完全从等式中删除 Windows)。