1

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.

4

2 に答える 2

4

やりたいことは、必要な情報を保持しているタプルを解凍することです。これを行うには複数の方法がありますが、これは私が行うことです。

(name, _, ip_address_list) = socket.gethostbyaddr(ip)
ip_address = ip_address_list[0]
destfile.write(ip_address + " resolves to " + name)
于 2013-01-25T20:31:55.910 に答える
4

さて、最初のステップは、ワンライナーを複数の行に分割することです。

host = socket.gethostbyaddr(ip)

今、あなたはあなたがそれをしたいことは何でもすることができます。何をしたいのかわからない場合は、印刷してみてhostくださいtype(host)。これは3つの要素で構成されていることがわかりますtuple(ただし、この場合は、ファイルに書き込まれた文字列から推測できます)。最初の要素が必要です。それで:

hostname = host[0]

または:

hostname, _, addrlist = host

これで、それを出力に書き込むことができます。

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

同じ情報を見つける別の方法は、次のようなドキュメントを確認することです。

トリプル(hostname、aliaslist、ipaddrlist)を返します。ここで、hostnameは指定されたip_addressに応答するプライマリホスト名、aliaslistは同じアドレスの代替ホスト名の(おそらく空の)リスト、ipaddrlistはIPv4/v6アドレスのリストです。同じホスト上の同じインターフェイスの場合(ほとんどの場合、単一のアドレスのみが含まれます)。

または、インタプリタに組み込まれているヘルプを使用するには、次のようにします。

>>> 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.
于 2013-01-25T20:32:24.410 に答える