目标是从文件中读取域列表并执行查找以确认我端的可达性和分辨率。
这是我写的:
#!/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()
行抛出异常。
for i in s:
print i
try:
socket.gethostbyname(i.strip())
except socket.gaierror:
print "unable to get address for", i
如果找不到地址,则
gethostbyname
will 引发异常(而不是抛出)。这就是 Python 中错误处理的方式。如果您知道如何正确处理错误,则应该使用 except
子句捕获它。
请注意,您还需要更多代码来检查连接性。
这就是我写的来做同样的事情。可能对你有用:
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
请注意,我的输入文件的格式与您的稍有不同,因此您需要调整输入部分。
您将字符串
'i'
传递给 gethostbyname() 而不是变量 i
。
应该是
socket.gethostbyname(i)
gethostbyname
线应该是
socket.gethostbyname(i.strip())
i
变量周围没有引号。 strip()
是删除尾随的 lf \ cr 字符,这会导致错误。
注意:这只会验证该域是否存在于 DNS 系统中,而不会验证该域是否可访问/正在运行。为此,您必须在远程主机正在侦听的端口上实际打开到远程主机的连接,
导入argparse 从套接字导入 getaddrinfo
if name == "main": parser = argparse.ArgumentParser(description='检查从交换导出的列表中域的有效性', version='%(prog)s 1.0') parser.add_argument('infile', nargs='+', type=str, help='输入文件列表') 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