2011-09-12 50 views
4

目的是從文件中讀取域列表並進行查詢,以確認從我的最終的可達性和分辨率。腳本來驗證域

這是我寫:

#!/usr/bin/python 

import os 
import socket 

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

for i in s: 
     try: 
#    get = socket.getaddrinfo(i.strip(), None) 
       get = socket.gethostbyname(i.strip()) 
       print 'Domain %s is valid' % (i.strip()) 
     except socket.gaierror, e: 
       print "Unable to resolve:", i.strip() 
f.close() 

更新腳本 - 現在罰款運行

+0

@Simon加入i.strip(),使這項工作。但只要它遇到不存在的域或無法解析的域,就會拋出異常並觸發。 – Sunshine

回答

3
for i in s: 
    print i 
    try: 
     socket.gethostbyname(i.strip()) 
    except socket.gaierror: 
     print "unable to get address for", i 

如果不能找到一個地址,然後gethostbyname拋出一個異常(不拋)。這是在Python中完成錯誤處理的方式。如果你知道如何正確處理這個錯誤,你應該用except條款來捕捉它。

請注意,您將需要一些更多的代碼還需要檢查連接。

+0

+1。有一個問題,雖然在閱讀異常時,我看到我們也可以使用else子句。什麼是差異B/W否則除了? – Sunshine

+0

請參閱[這個問題](http://stackoverflow.com/questions/855759/python-try-else)一個很好的答案。 –

1

您傳遞字符串'i'到的gethostbyname()而不是變量i

應該socket.gethostbyname(i)

這個問題可能是有用的:Checking if a website is up via Python

+0

日Thnx但只是保持 - 我 - 有仍然給予,因爲在輸入尾隨CR \ \ n的錯誤。 – Sunshine

+0

感謝您的鏈接,檢查網站是否啓動。我會看看。 – Sunshine

+0

是的,如果你遍歷文件中的行,你需要剝去新線。 – Acorn

1

gethostbyname線應

socket.gethostbyname(i.strip()) 

與各地i變量不包括引號。 strip()用於刪除將導致錯誤的尾隨lf \ cr字符。

注意:這將只驗證該域存在於DNS系統中,而不是它可以訪問/正在運行。爲此,您將不得不打開一個連接到遠程主機,在它正在監聽的端口上,

+0

加入i.strip()使這項工作。但只要它遇到不存在的域或無法解析的域,就會拋出異常並觸發。 – Sunshine

+0

您需要處理異常。本頁解釋try..except http://en.wikibooks.org/wiki/Python_Programming/Exceptions – Acorn

+0

@Acorn日Thnx的鏈接。 – Sunshine

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 

請注意,我輸入文件有比你稍微不同的格式,所以你需要調整輸入部分。

+1

捕捉'異常'通常不是一個好主意,因爲它幾乎是系統中可能出現的任何異常,並且可以隱藏其他問題。你可能想要捕獲'socket.gaierror'或'socket.error'。 –

+0

謝謝@Spencer。異常處理塊非常有用。另外,我想你也可以在腳本中使用gethostbyname()。 – Sunshine

+0

@Ehan,我最初使用'Exception',但在閱讀您的評論之後,我也查看了其他異常關鍵字。我的腳本給出了一個gaierror,所以我最終包含了這個,而不是'exception'。謝謝 – Sunshine