例如,如果我在 DNS 配置中定义了以下 SRV 记录
_dev._tcp IN SRV 0 0 8400 dev.server.com.
我可以执行以下命令
host -lt SRV server.com
它为我提供了 dns 服务器 (server.com) 中 SRV 记录的完整列表。如果我想使用 JNDI 查找做同样的事情
Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
DirContext ctx = new InitialDirContext(env);
Attributes attributes = ctx.getAttributes("server.com", new String [] { "SRV" });
return attributes;
上面的代码没有返回任何属性。如果我将上面代码中的倒数第二行更改为这样,
Attributes attributes = ctx.getAttributes("_dev._tcp.server.com", new String [] { "SRV" });
它有效。
但问题是我之前不知道完整的域名,我必须查找 SRV 记录才能找到完整的域名。
关于如何做到这一点有什么想法吗?
最佳答案
/usr/bin/host
的 -l
参数指示 DNS 区域传输。与传统的 DNS 查询不同,区域传输通过 TCP 进行。
这是 host -lt SRV server.com
的作用:
- 查找
server.com
的名称服务器。 - 使用 TCP 连接到第一个列出的名称服务器的端口 53。
- 启动区域传输。
- 根据其
-t srv
过滤器过滤出结果。
您需要通过 JNDI 启动区域传输并筛选出您要查找的结果。在 DnsContext
中调用 DNS 区域传输的方法是 list()
。
NamingEnumeration<NameClassPair> names = ctx.list("server.com");
恕我直言,JNDI 的界面很糟糕。它被设计为非常通用的所有命名和目录服务,并且接口(interface)和 DNS 之间的机械和技术不匹配简直令人沮丧。
如果您正在寻找更实用、更易于使用且功能齐全的 DNS 库,请查看 dnsjava 项目 http://www.dnsjava.org
另请记住,并非每个 DNS 服务器都允许来自不受信任的主机的区域传输。如今,即使是 LAN DNS 服务器也默认不允许区域传输。
关于java - 使用部分域名的 JNDI DNS 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527263/