2010-10-01 26 views
10

Mam skrypt DNS, który umożliwia użytkownikom rozpoznawanie nazw DNS przez wpisanie nazw witryn w wierszu polecenia systemu Windows.Jak rozwiązać problem z DNS w Pythonie?

Przeanalizowałem kilka przewodników dotyczących rozwiązania DNS, ale mój skrypt nadal nie może rozwiązać nazw (www.google.com) lub (google.com) adresów IP.

Skrypt generuje błąd w

Traceback (most recent call last): 
    File "C:\python\main_menu.py", line 37, in ? 
    execfile('C:\python\showdns.py') 
    File "C:\python\showdns.py", line 3, in ? 
    x = input ("\nPlease enter a domain name that you wish to translate: ") 
    File "<string>", line 0, in ? 
NameError: name 'google' is not defined 

Kod:

import socket 

x = input ("\nPlease enter a domain name that you wish to translate: ") 

print ("\n\nThe IP Address of the Domain Name is: "+socket.gethostbyname_ex(x)) 

x = raw_input("\nSelect enter to proceed back to Main Menu\n") 
if x == '1': 
execfile('C:\python\main_menu.py') 

Proszę podać informacje na temat kodów. Dzięki!

Odpowiedz

19

input() jest niewłaściwą funkcją do zastosowania tutaj. W rzeczywistości ocenia ciąg znaków wprowadzony przez użytkownika.

Również gethostbyname_ex zwraca więcej niż tylko ciąg znaków. Więc twoje oświadczenie o druku również by się nie powiodło.

W twoim przypadku to kod powinien działać:

import socket 

x = raw_input ("\nPlease enter a domain name that you wish to translate: ") 

data = socket.gethostbyname_ex(x) 
print ("\n\nThe IP Address of the Domain Name is: "+repr(data)) 

x = raw_input("\nSelect enter to proceed back to Main Menu\n") 
if x == '1': 
    execfile('C:\python\main_menu.py') 
+1

Niesamowite odpowiedź kolego! Dzięki! Ale nie rozumiem części "repr (dane)". Umysł mi wyjaśnia? Dzięki! – JavaNoob

+1

@JavaNoob: 'repr' zwraca ciąg znaków zawierający drukowaną reprezentację obiektu. http://docs.python.org/library/functions.html#repr –

+1

Powinien być repr (dane [2]) - gethostbyname_ex() zwraca tablicę, której trzecim elementem jest adres IP. – ripper234

-1

Użyj raw_input zamiast input.

9
#!/user/bin/env python 
""" 
Resolve the DNS/IP address of a given domain 
data returned is in the format: 
(name, aliaslist, addresslist) 
@filename resolveDNS.py 
@version 1.01 (python ver 2.7.3) 
@author LoanWolffe 
""" 
import socket 

def getIP(d): 
    """ 
    This method returns the first IP address string 
    that responds as the given domain name 
    """ 
    try: 
     data = socket.gethostbyname(d) 
     ip = repr(data) 
     return ip 
    except Exception: 
     # fail gracefully! 
     return False 
# 
def getIPx(d): 
    """ 
    This method returns an array containing 
    one or more IP address strings that respond 
    as the given domain name 
    """ 
    try: 
     data = socket.gethostbyname_ex(d) 
     ipx = repr(data[2]) 
     return ipx 
    except Exception: 
     # fail gracefully! 
     return False 
# 
def getHost(ip): 
    """ 
    This method returns the 'True Host' name for a 
    given IP address 
    """ 
    try: 
     data = socket.gethostbyaddr(ip) 
     host = repr(data[0]) 
     return host 
    except Exception: 
     # fail gracefully 
     return False 
# 
def getAlias(d): 
    """ 
    This method returns an array containing 
    a list of aliases for the given domain 
    """ 
    try: 
     data = socket.gethostbyname_ex(d) 
     alias = repr(data[1]) 
     #print repr(data) 
     return alias 
    except Exception: 
     # fail gracefully 
     return False 
# 

# test it 

x = raw_input("Domain name or IP address? > ") 


a = getIP(x) 
b = getIPx(x) 
c = getHost(x) 
d = getAlias(x) 

print " IP ", a 
print " IPx ", b 
print " Host ", c 
print " Alias ", d 
Powiązane problemy