使用Python的socket.gethostbyaddr()存在困难。

14

我正在尝试使用Python中的socket.gethostbyaddr()方法对IP地址列表进行反向DNS查询,但对于某些值,该方法会返回“Unknown Host”,而使用dig则能够返回主机名。此外,与使用Python模块相比,dig似乎快得多,是否有具体原因?

import socket

# This returns 'Unknown Host' 
name, alias, addresslist = socket.gethostbyaddr('114.143.51.197')

1
当我反向解析4.2.2.2时,gethostbyaddr对我来说运行良好。请发布存在问题的代码。 - Mike Pennington
import socket name,alias,addresslist = socket.gethostbyaddr('114.143.51.197')这将返回“未知主机”然而,使用dig -x 114.143.51.197+short命令会给我返回主机名。我使用的DNS解析器是8.8.8.8和8.8.4.4,但仍然没有成功。 - bilkulbekar
1个回答

19

根据评论内容,使用dig -x 114.143.51.197+short可以给出主机名。

然而,我很抱歉地告诉您,114.143.51.197没有PTR记录... 因此socket.gethostbyaddr()应该会报错... 要正确处理这种情况,请添加try/except子句以捕获socket.herror异常

>>> def dns_ptr_lookup(addr):
...     try:
...         return socket.gethostbyaddr(addr)
...     except socket.herror:
...         return None, None, None
...
>>> # At this time, 4.2.2.2 has a valid PTR
>>> name,alias,addresslist = dns_ptr_lookup('4.2.2.2')
>>> print(name)
vnsc-bak.sys.gtei.net
>>>
>>> # At this time, 114.143.51.197 does NOT have a valid PTR
>>> name,alias,addresslist = dns_ptr_lookup('114.143.51.197')
>>> print(name)
None
>>>

对于114.143.51.197的DNS反向查找...请注意它没有有效的PTR记录。

[mpenning@Bucksnort ~]$ dig @8.8.8.8 -x 114.143.51.197

; <<>> DiG 9.6-ESV-R4 <<>> @8.8.8.8 -x 114.143.51.197
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 4735
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;197.51.143.114.in-addr.arpa.   IN      PTR

;; AUTHORITY SECTION:
114.in-addr.arpa.       1800    IN      SOA     ns1.apnic.net. read-txt-record-of-zone-first-dns-admin.apnic.net. 17812 7200 1800 604800 172800

;; Query time: 182 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Nov 22 05:11:36 2011
;; MSG SIZE  rcvd: 134

[mpenning@Bucksnort ~]$ python
Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyaddr('114.143.51.197')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.herror: (1, 'Unknown host')
>>>

以下是有效的PTR记录的样子...

[mpenning@Bucksnort ~]$ dig -x 4.2.2.2

; <<>> DiG 9.6-ESV-R4 <<>> -x 4.2.2.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61856
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 1

;; QUESTION SECTION:
;2.2.2.4.in-addr.arpa.          IN      PTR

;; ANSWER SECTION:
2.2.2.4.in-addr.arpa.   86400   IN      PTR     vnsc-bak.sys.gtei.net.

;; AUTHORITY SECTION:
2.4.in-addr.arpa.       86400   IN      NS      dnsauth2.sys.gtei.net.
2.4.in-addr.arpa.       86400   IN      NS      dnsauth1.sys.gtei.net.
2.4.in-addr.arpa.       86400   IN      NS      dnsauth3.sys.gtei.net.

;; ADDITIONAL SECTION:
dnsauth1.sys.gtei.net.  1800    IN      A       4.2.49.2

;; Query time: 308 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Nov 22 05:10:16 2011
;; MSG SIZE  rcvd: 158

[mpenning@Bucksnort ~]$ python
Python 2.5.2 (r252:60911, Jan 24 2010, 14:53:14)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyaddr('4.2.2.2')
('vnsc-bak.sys.gtei.net', [], ['4.2.2.2'])
>>>

我明白了。我以为dig会提供主机名,但实际上并没有。谢谢。 - bilkulbekar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接