Question

I have a script that reads addresses from a file and looks up its hostname with socket.gethostbyaddr, however the return of this function is messy and doesn't look right.

The line where it writes to the destination file reads:

destfile.write(str(socket.gethostbyaddr(ip)))

The results come out like this when it reads 8.8.8.8:

('google-public-dns-a.google.com', [], ['8.8.8.8])

However, I only need that first output, google-public-dns-a.google.com. I hope to have it write to the file and look like this:

8.8.8.8 resolves to google-public-dns-a.google.com

Anyone know how to split this? Can provide more code if needed.

Was it helpful?

Solution

Well, the first step is to split the one-liner up into multiple lines:

host = socket.gethostbyaddr(ip)

Now, you can do whatever you want to that. If you don't know what you want to do, try printing out host and type(host). You'll find that it's a tuple of 3 elements (although in this case, you could have guessed that from the string written to the file), and you want the first. So:

hostname = host[0]

Or:

hostname, _, addrlist = host

Now, you can write that to the output:

destfile.write('{} resolves to {}'.format(ip, hostname))

Another way to discover the same information would be to look at the documentation, which says:

Return a triple (hostname, aliaslist, ipaddrlist) where hostname is the primary host name responding to the given ip_address, aliaslist is a (possibly empty) list of alternative host names for the same address, and ipaddrlist is a list of IPv4/v6 addresses for the same interface on the same host (most likely containing only a single address).

Or to use the built-in help in the interpreter:

>>> help(socket.gethostbyaddr)
gethostbyaddr(host) -> (name, aliaslist, addresslist)

Return the true host name, a list of aliases, and a list of IP addresses,
for a host.  The host argument is a string giving a host name or IP number.

OTHER TIPS

What you want to do is unpack the tuple holding the information you want. There are multiple ways to do this, but this is what I would do:

(name, _, ip_address_list) = socket.gethostbyaddr(ip)
ip_address = ip_address_list[0]
destfile.write(ip_address + " resolves to " + name)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top