Linux中是否有任何bash命令/脚本,以便我们可以从长列表中提取活动域,
例如,我有一个csv文件(domain.csv(有5500万个域水平列出,我们只需要CSV文件中的活动域(active.csv(
这里的活动是指至少具有网页的域,而不是已过期或未过期的域。 示例 whoisdatacenter.info 未过期,但它没有网页,我们认为它是非活动的。
我检查谷歌和堆栈网站。我看到我们可以通过 2 种方式获得域名。喜欢
$ curl -Is google.com | grep -i location
Location: http://www.google.com/
or
nslookup google.com | grep -i name
Name: google.com
但我不知道如何为 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.com 13: 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 回车符;这是一个常见的常见问题解答,在 shell 脚本对编码和行尾敏感吗?
您可以并行运行多个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(。