【问题标题】:How can I check the value of a DNS TXT record for a host?如何检查主机的 DNS TXT 记录的值?
【发布时间】:2012-07-27 04:52:12
【问题描述】:

我希望通过脚本(特别是 Python 脚本)验证域所有权,并且想知道如何查找 DNS TXT 条目的值。我知道有这方面的服务和网站,但我想用脚本来做。

【问题讨论】:

    标签: python dns


    【解决方案1】:

    这很容易使用dnspython。这是一个例子:

    import dns.resolver
    print dns.resolver.query("aaa.asdflkjsadf.notatallsuspicio.us","TXT").response.answer[0][-1].strings[0]
    

    这给出了以下输出:

    PnCcKpPiGlLfApDbDoEcBbPjIfBnLpFaAaObAaAaMhNgNbIfPbHkMiEfPpGgJfOcPnLdDjBeHkOjFjIbPbIoKhIjHfJlAhAhFgGbGgNlMgKmFkLgNfBjMbCoBeNbGeOnAeHgLmKoFlLhLmDcKlEdEbDpFeHkFaBlGnHiOnChIoMlIhBgOnFfKoEhDnFkKfDaMgHbJhMgPgMjGiAoJpKjKkPaIcAdGiMbIbBbAfEiKjNbCeFoElKgOePmGjJaImL
    

    另一种选择是在子进程中使用dig

    import subprocess
    
    print subprocess.Popen(["dig","-t","txt","aaa.asdflkjsadf.notatallsuspicio.us","+short"], stdout=subprocess.PIPE).communicate()[0] 
    

    【讨论】:

    • 你可以在这里使用subprocess.check_output() 而不是.communicate()
    • @J.F.Sebastian - 看起来像是我还没有使用的 2.7 新功能。感谢您的提示。
    • @CppLearner 没有任何“错误”,但check_output 看起来更简单一些。
    • 好吧,我刚刚搜索了一下,似乎很多人更喜欢旧的交流方式。 stackoverflow.com/questions/4814970/… 无论如何,它有利有弊。谢谢!
    • 我不知道你在说什么缺点。 check_output 和许多其他包装器简化了简单案例的逻辑。仅当所有 check_* 包装器对您的需求简单时,您才应该使用裸 Popen
    【解决方案2】:

    这可能过于简化,但如果您只想快速阅读 TXT 记录并且不介意单独处理解析结果:

    nslookup -q=txt somedomain.com
    

    我发现这满足了我的需要,又短又甜。

    【讨论】:

      【解决方案3】:

      找到了另一种使用dnspython 获取域的所有 TXT 记录列表的方法。

      import dns.resolver
      [dns_record.to_text() for dns_record in dns.resolver.resolve("your-domain-here", "TXT").rrset]
      

      【讨论】:

        【解决方案4】:

        这样的方法至少应该可以获取 URL 的值,我以 google.com 为例。

        import pycurl
        import StringIO
        url = "whatsmyip.us/dns_txt.php?host=google.com"
        c = pycurl.Curl()
        c.setopt(pycurl.URL, url)
        c.setopt(pycurl.HTTPHEADER, ["Accept:"])
        txtcurl = StringIO.StringIO()
        c.setopt(pycurl.WRITEFUNCTION, txtcurl.write)
        c.perform
        
        data = txtcurl.getvalue()
        data = data.replace("Done!", "")
        print data
        

        我没有对此进行任何测试,而是从以前的项目中提取了它。

        祝你好运!

        【讨论】:

        • 在 Python 中执行一个 HTTP 请求不需要十行代码。无论哪种方式,这都是一个糟糕的答案,但如果你要这样做,至少使用 requests.get("http://whatsmyip.us/dns_txt.php?host=google.com") 代替。
        猜你喜欢
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        相关资源
        最近更新 更多