您没有指定您的环境是什么,但如果您使用的是Unix,我认为dig和grep的组合应该可行. ns.example.com应该是您的名称服务器的主机名,example.com是您的主机所属的域,HOST是您要查找所有CNAME记录的主机.这实际上是grep命令中的制表符,而不是字面上的< TAB> (您可能需要调整grep字符串).
您的名称服务器也需要配置为允许区域传输,其详细信息将取决于实现.
dig @ns.example.com example.com axfr |grep 'CNAME<tab>HOST$'
或者,如果您使用的是Windows,则可以使用nslookup:
C:\> nslookup > name ns.example.com > ls -a example.com FILE
这应该将ns.example.com“知道”的域example.com的所有记录输出到FILE.然后,您可以使用您想要在文本文件中排序的任何工具来查找相应的CNAMES.
或者使用这个未经测试(但看起来正确的)perl script:
#!/usr/bin/perl use Net::DNS; ($target,$zone) = @ARGV; $res = new Net::DNS::Resolver; foreach $rr ($res->axfr($zone)) { print $rr->name."\n" if (($rr->type eq "CNAME") && ($rr->rdatastr eq $target.".")); }
完整性的几点:
>正如@womble所说,CNAME没有相当于PTR的记录.您必须通过对与主机的A记录对应的CNAMES的所有区域信息进行排序来使用一些上下文感知.>这仅适用于您的DNS服务器(如果您有权查看区域信息).没有办法为属于其他区域的主机“跟踪”CNAMES.>正如@BillThor所述,除了CNAMES之外,还有其他方法可以将主机名别名.同样,您需要一些上下文意识.