8

任何人以前遇到过这个:

更新 DNS 记录后..我对“test.somedomain.com”进行挖掘,得到 167.69.143.234,但是当我执行 socket.gethostbyname('test.somedomain.com') 时,得到 167.69.6.234。

我猜套接字仍在使用缓存...我该如何清除它?还是冲洗它?

我的代码很简单:

Linux 终端

dig test.somedomain.com

Python:

import socket
socket.gethostbyname('test.somedomain.com')

它应该返回 167.69.143.234 地址,因为这是 DNS 中的更新地址。

4

2 回答 2

7

Pythonsocket.gethostbyname使用操作系统解析器,并且没有用于清除缓存的 API。缓存(可能是操作系统或操作系统或标准库组件使用的缓存 DNS 服务器)是 DNS 系统的基本元素,处理它的“正确方法”是等到记录的 TTL 值expires(操作系统应该从缓存中删除过时的值)。更新 DNS 时,您可能应该早先调整旧值的 TTL。

您还可以使用 Python DNS 实现,例如 DNSPython 而不是使用socket.gethostbyname- 您应该完全控制解析器缓存(但不是解析器使用的 NS 缓存)。不过,它可能无法解决您的问题(我猜是使用现有代码)。

于 2011-08-03T15:04:58.883 回答
4

默认情况下,DNS 不会在 Linux 上缓存,并且需要一个守护进程,例如sssdnscd. 您可以简单地重新启动守护程序以强制拉入新地址。

Windows 用户注意事项:有一个默认缓存,可以使用ipconfig /flushdns.

或者,您可能有一个硬编码条目/etc/hosts,请先检查那里。类似dignslookup将直接查询 DNS 服务器并绕过 NSS 库子系统的工具。

于 2011-08-04T08:28:33.660 回答