24

I have a DNS script which allow users to resolve DNS names by typing website names on a Windows command prompt.

I have looked through several guides on the DNS resolve but my script can't still seem to resolve the names (www.google.com) or (google.com) to IP address.

The script outputs an error of

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 

The code:

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') 

Please give advice on the codes. Thanks!

3 Answers 3

40

input() is the wrong function to use here. It actually evaluates the string that the user entered.

Also gethostbyname_ex returns more than just a string. So your print statement would also have failed.

In your case this code should work:

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') 
Sign up to request clarification or add additional context in comments.

5 Comments

Awesome answer mate! Thanks! But I do not understand the "repr(data)" part. Mind explaining to me? Thanks!
@JavaNoob: repr returns a string containing a printable representation of an object. docs.python.org/library/functions.html#repr
Should be repr(data[2]) - gethostbyname_ex() returns an array, whose third element is the IP address.
You could also do socket.gethostbyname(x), which returns just the IP address instead of all the extras.
getaddrinfo might be useful - gethostbyname_ex is limited to IPv4
23
#!/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 

1 Comment

this worked fine when stand alone, but I incorporated it into Fail2Ban's filter.py for logging the name, then it returns False for the gethost call, even though the parameter sent is clearly an IP address.
-3

Use raw_input instead of input.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.