bash - 如何提取活动域
问题描述
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 脚本配合得很好
非常感谢!!
解决方案
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)。
推荐阅读
- java - 我不断收到此错误“com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为类型”
- ssh - 如何为一台特定主机禁用 ProxyCommand?
- javascript - 如何获取下一个 7 个工作日的日期
- mongodb - db.getCollection(...).find(...).aggregate 不是函数
- python - 如何在使用 df.astype() 时保留原始 pandas 数据帧值?我需要为下面的示例提出一个值错误
- java - Spring数据redis并发问题
- php - 如何解析 std 对象以获取特定数据
- autodesk-forge - Autodesk Forge Viewer - 如何在模型加载完成后触发事件?
- javascript - 将范围映射到单值 Javascript
- python - 使用正则表达式过滤字符串列表