例如,如果我在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记录才能找到完整的域名。
有关如何做到这一点的想法吗?
答案 0 :(得分:2)
-l
/usr/bin/host
参数指示DNS区域传输。与传统的DNS查询不同,区域传输通过TCP工作。
以下是host -lt SRV server.com
的作用:
server.com
。-t srv
过滤器过滤掉结果。您需要通过JNDI启动区域传输,并过滤掉您要查找的结果。在DnsContext
中调用DNS区域传输的方法是list()
。
NamingEnumeration<NameClassPair> names = ctx.list("server.com");
恕我直言,JNDI有一个糟糕的界面。它被设计成非常通用的所有命名和目录服务,并且接口和DNS之间的机械和技术不匹配简直令人沮丧。
如果您正在寻找更实用,更易于使用且功能齐全的DNS库,请查看http://www.dnsjava.org上的dnsjava项目
另请注意,并非每个DNS服务器都允许从不受信任的主机进行区域传输。现在,即使是LAN DNS服务器也不会默认允许区域传输。