【发布时间】:2014-10-23 19:38:40
【问题描述】:
我目前正在处理解析dig 命令的输出。该命令输出规范名称,然后输出最后一条记录的实际 IP。
例如,解析dig mail.yahoo.com 会执行以下操作:
borrajax@borrajax.kom /tmp/ $ dig @8.8.8.8 @4.2.2.2 +nocomments \
+noquestion +noauthority +noadditional \
+nostats +nocmd mail.yahoo.com
mail.yahoo.com. 0 IN CNAME login.yahoo.com.
login.yahoo.com. 0 IN CNAME ats.login.lgg1.b.yahoo.com.
ats.login.lgg1.b.yahoo.com. 0 IN CNAME ats.member.g02.yahoodns.net.
ats.member.g02.yahoodns.net. 0 IN CNAME any-ats.member.a02.yahoodns.net.
any-ats.member.a02.yahoodns.net. 49 IN A 98.139.21.169
所以我希望能够说mail.yahoo.com 解析为98.139.21.169,为此,我需要将mail.yahoo.com“合并”到login.yahoo.com,然后将login.yahoo.com 合并到@987654330 @...等...直到到达最后一个A记录。
在another question 中,我已经有了一个很好的正则表达式来解析dig 的输出,所以我可以很好地清理这些行并将其存储到一个列表中:
[
('mail.yahoo.com', 'CNAME', 'login.yahoo.com'),
('login.yahoo.com', 'CNAME', 'ats.login.lgg1.b.yahoo.com'),
('ats.login.lgg1.b.yahoo.com', 'CNAME', 'ats.member.g02.yahoodns.net'),
('ats.member.g02.yahoodns.net', 'CNAME', 'any-ats.member.a02.yahoodns.net'),
('any-ats.member.a02.yahoodns.net', 'A', '98.139.21.169')
]
问题是:我怎样才能有效地以一般方式做到这一点,所以如果我在CNAMEs 之间有一些其他随机线,它也可以工作:
[
('mail.yahoo.com', 'CNAME', 'login.yahoo.com'),
('foo.com', 'CNAME', 'baz.com'), # Wooops, watch out!
('login.yahoo.com', 'CNAME', 'ats.login.lgg1.b.yahoo.com'),
('ats.login.lgg1.b.yahoo.com', 'CNAME', 'ats.member.g02.yahoodns.net'),
('baz.com', 'A', '204.236.134.199'), # Wooops, watch out!
('ats.member.g02.yahoodns.net', 'CNAME', 'any-ats.member.a02.yahoodns.net'),
('any-ats.member.a02.yahoodns.net', 'A', '98.139.21.169')
]
所需的输出是:
-
mail.yahoo.com解析为98.139.21.169 -
foo.com解析为204.236.134.199
当然,我可以检查所有 CNAMES 以及每次找到它时实际解析的内容,但那将是 O(n^2)... 这太可怕了。
我确信有更好的方法,但我想不出任何方法。提前感谢您的任何想法。
【问题讨论】:
-
第一个/原始查询的 ip 地址(你想要的那个)是否总是像这样显示为所有文本的最后一项??
-
另外,在您遇到另一个不想要的地址的示例中,它最终是 ip,我注意到它有点嵌套在原始查询和解析中,总是这样吗?
-
确实如此,但这个特殊的“问题”让我思考如何在更随机的场景中解决这个问题
-
随机,因为有时不是这样?其他 ip 紧随其后?
-
是的,就像...一个完全未分类的疯狂输出 :-)