最近工做須要,要對一些域名進行操做,需求是這樣的,用從N個域名解析中找出某N個IP地址,最終的目的是要刪除這些IP,因此第一步就是看那些域名解析到了這些ip上,由於涉及的域名數量不少,每一個都dig一遍人肉去查看很是費時間,因此本着我們運維自動化的精神,那個寫腳本是必須的了,一勞永逸工做是很是值得作的,咱們先來看腳本內容:python
#!/usr/bin/evn pythonapp
import socket運維
import sysdom
def readFile(file):socket
hosts=[]ide
f = open(file)函數
for i in f:spa
hosts.append(i.strip())orm
f.close()ip
return hosts
def returnIP(domain):
ip=[]
try:
results=socket.getaddrinfo(domain,None)
for res in results:
ip.append(res[4][0])
return list(set(ip))
except Exception,e:
print str(e)
def doResolve(fr):
hosts=readFile(fr)
domain={}
for host in hosts:
ip = returnIP(host)
domain[host]=ip
return domain
if __name__=='__main__':
domain=doResolve('modify_domain2.txt')
delips=['ip1','ip2','ip3']
domain_res=[k for delip in delips for k,v in domain.items() if domain[k] is not None if delip in domain[k] ]
print domain_res
腳本逐行解釋,腳本仍是用到了上次咱們提到的socket模塊,而後定義了三個函數,readFile()函數是讀取文件,而後返回一個存有域名的列表,returnIP()這個函數是作實際解析工做的,函數返回一個ip列表,這個函數是腳本核心因此咱們詳細解釋下:
其中socket.getaddrinfo()函數返回解析的內容,它會函數返回一個元組,結構是這樣的:
(family, socktype, proto, canonname, sockaddr)
family示協議族(1表示AF_UNIX,2表示AF_INET,10表示AF_INET6)
sockettype表示socket類型(1 即TCP,2 即UDP,還有3是原始套接字)
proto,表示套接字協議,6表示TCP,17表示UDP,其它的能夠本身去查。
canonname,這個是ai_flags的標誌位,若是設置返回規範主機名,若是不設置就是空,通常都是空
sockaddr若是是ipv4就返回ip和端口號,若是是ipv6,除了ip和端口,還會返回流信息和範圍id.
咱們來看一個例子,好比咱們解析百度返回以下:
>>> socket.getaddrinfo('www.baidu.com',None)
[(2, 1, 6, '', ('220.181.112.244', 0)), (2, 2, 17, '', ('220.181.112.244', 0)), (2, 3, 0, '', ('220.181.112.244', 0)), (2, 1, 6, '', ('220.181.111.188', 0)), (2, 2, 17, '', ('220.181.111.188', 0)), (2, 3, 0, '', ('220.181.111.188', 0))]
有了以上的內容作基礎,再看返回的信息就比較容易了,因此我也很少廢話了,有問題的能夠給我留言。
doResolve()函數其實就是調用以上兩個函數將最終解析的結果以字典的形式返回,而後在主函數中調用,delips是要找的IP地址,最後用一個列表生成器生成解析到這些ip上的域名