【问题标题】:Script to validate domains验证域的脚本
【发布时间】:2011-11-15 07:23:05
【问题描述】:

目标是从文件中读取域列表并执行查找以确认我的可达性和分辨率。

这是我写的:

#!/usr/bin/python

import os
import socket

f = open('file1.lst', 'r')
s = f.readlines()

for i in s:
    print i
    socket.gethostbyname(i.strip())

f.close()

socket.gethostbyname() 行抛出异常。

【问题讨论】:

  • @Simon 添加 i.strip() 使这项工作。但是一旦遇到不存在的域或无法解析的域,它就会抛出异常并中断。

标签: python sockets file-io dns


【解决方案1】:
for i in s:
    print i
    try:
        socket.gethostbyname(i.strip())
    except socket.gaierror:
        print "unable to get address for", i

如果找不到地址,那么gethostbyname引发异常(而不是抛出)。这是在 Python 中进行错误处理的方式。如果您知道如何正确处理错误,您应该使用except 子句来捕获它。

请注意,您还需要一些代码来检查连接性。

【讨论】:

  • +1。但是有一个问题,在阅读异常时,我看到我们也可以使用 else 子句。其他和除外的黑白差异是什么?
  • 请参阅this question 以获得好的答案。
【解决方案2】:

这是我写的做同样的事情。它可能对你有用:

import argparse
from socket import getaddrinfo

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Check for validity of domains in list exported from exchange', version='%(prog)s 1.0')
    parser.add_argument('infile', nargs='+', type=str, help='list of input files')
    args = parser.parse_args()

    # Read domains from file
    domains = []
    for f in args.infile:
        with open(f, 'rt') as data:
            for line in data.readlines():
                split = line.replace('\x00',"").split(':')
                if split[0].strip() == 'Domain':
                    domains.append(split[1].strip())

    # Check each domain
    for domain in domains:
        try:
            getaddrinfo(domain, None)
        except Exception, e:
            print "Unable to resolve:", domain

请注意,我的输入文件与您的格式略有不同,因此您需要调整输入部分。

【讨论】:

  • 捕获Exception 通常不是一个好主意,因为它几乎是系统中所有可能的异常,并且可以隐藏其他问题。您可能想捕捉socket.gaierrorsocket.error
  • 谢谢@Spencer。异常处理块非常有用。另外,我想您也可以在脚本中使用 gethostbyname()。
  • @Ethan,我最初使用的是“异常”,但在阅读了您的 cmets 之后,我也查看了其他异常关键字。我的脚本给出了一个 gaierror,所以我最终包含了这个而不是“异常”。谢谢
  • @Ethan Furman 在我写这篇文章的时候,我只需要一个简短的脚本来检查域名的合法性。我只关心它有问题解决的域,我并不特别关心为什么。但是,我确实同意更彻底的脚本应该只捕获特定的异常。
【解决方案3】:

您将字符串 'i' 传递给 gethostbyname() 而不是变量 i

应该是socket.gethostbyname(i)

这个问题可能有用:Checking if a website is up via Python

【讨论】:

  • Thnx 但只是保留 -i - 由于输入中的尾随 cr \ \n 仍然出现错误。
  • 感谢您提供检查网站是否正常运行的链接。我去看看。
  • 是的,如果您要遍历文件中的行,则需要去除换行符。
【解决方案4】:

gethostbyname 行应该是

socket.gethostbyname(i.strip())

i 变量周围没有引号。 strip() 是去掉尾随的 lf \ cr 字符,这会导致错误。

注意:这只会验证该域是否存在于 DNS 系统中,而不是它是否可访问/正在运行。为此,您必须在它正在侦听的端口上实际打开与远程主机的连接,

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多