我正在尝试使用python中的socket.gethostbyaddr()来反转IP地址的dns列表,这将为某些值返回“未知主机”,但对于相同的ip使用dig将返回主机名。另外,dig似乎比使用python模块要快得多,这是否有任何特定原因?
import socket # This returns 'Unknown Host' name, alias, addresslist = socket.gethostbyaddr('114.143.51.197')
抱歉,您误会了。114.143.51.197没有PTR记录…因此socket.gethostbyaddr()应该引发错误…您当然需要try/except子句,用于socket.herror
socket.gethostbyaddr()
try
except
socket.herror
>>> def lookup(addr): ... try: ... return socket.gethostbyaddr(addr) ... except socket.herror: ... return None, None, None ... >>> name,alias,addresslist = lookup('4.2.2.2') >>> print name vnsc-bak.sys.gtei.net >>> name,alias,addresslist = lookup('114.143.51.197') >>> print name None >>>
DNS反向查找114.143.51.197 …请注意,它没有有效的PTR记录
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']) >>>