首页 > 解决方案 > 如何提取活动域

问题描述

Linux 中是否有任何 bash 命令/脚本,以便我们可以从长列表中提取活动域,

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

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

我检查谷歌和堆栈网站。我看到我们可以通过两种方式获得域。喜欢

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

or 

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

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

下面的命令,不会给出任何结果,所以我想出 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.com\013: NXDOMAIN

[已解决] Ravi 脚本运行良好,我在我的 MAC 中运行,导致 Nslookup 错误,我在 CentOS Linux 服务器上工作,Nslookup 与 Ravi 脚本配合得很好

非常感谢!!

标签: bashcurlawkgrepnslookup

解决方案


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

(此外,nslookup对脚本编写不是特别友好;您将希望改为查看dig自动化。)

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

即时错误消息表明您的输入文件中有 DOS 回车;这是一个常见的常见问题解答,在外壳脚本对编码和行尾敏感吗?

您可以并行运行多个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 回车;您可能真的应该(并考虑完全从等式中删除 Windows)。


推荐阅读