使用Java JNDI

时间:2016-11-08 10:23:53

标签: java dns

我正在使用Java JNDI根据下面的SSCCE使用以下基本语法执行DNS查找,但我尝试使用“ANY”属性查询所有记录:

import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;

public class SSCCE {
  public static void main(String[] args) {
    try {
      Properties p = new Properties();
      p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
      InitialDirContext idc = new InitialDirContext(p);

      Attributes attrs = idc.getAttributes("netnix.org", new String[] { "* *" });
      Attribute attr = attrs.get("* *");

      if (attr != null) {
        for (int i = 0; i < attr.size(); i++) {
          System.out.println("Found " + (String)attr.get(i));
        }
      }
      else {
        System.out.println("Found nothing");
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

我的问题是能够查询资源类型“ANY”,它应返回与特定域相关的所有DNS资源记录 - 例如下面的“host”实用程序。

chrixm@puffy(:):~$ host -t ANY netnix.org
netnix.org has SPF record "v=spf1 include:_spf.google.com ~all"
netnix.org mail is handled by 10 aspmx2.googlemail.com.
netnix.org mail is handled by 5 alt1.aspmx.l.google.com.
netnix.org mail is handled by 1 aspmx.l.google.com.
netnix.org mail is handled by 5 alt2.aspmx.l.google.com.
netnix.org mail is handled by 10 aspmx3.googlemail.com.
netnix.org name server ns-1154.awsdns-16.org.
netnix.org name server ns-941.awsdns-53.net.
netnix.org name server ns-61.awsdns-07.com.
netnix.org name server ns-1880.awsdns-43.co.uk.

我看过http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/jndi-dns.html,其中说:

  

还定义了超类属性标识符。使用DirContext.getAttributes()方法查询记录时,这些可能很有用。如果属性名称具有“*”来代替类型名称(或类名称),则它表示任何类型(或类)的记录。例如,属性标识符“IN *”可以传递给getAttributes()方法以查找所有Internet类记录。属性标识符“* *”表示任何类或类型的记录。

但是,Java JNDI不理解“*”或“* *”的资源记录,因为上面的代码没有返回任何记录(我能够单独查询“NS”或“SOA”等) - 有任何人有任何使这项工作的经验。我当然可以查询每个单独的资源类型,但考虑到根据RFC 1035(类型ID 255)有一个有效的记录类型“ANY”,这似乎非常低效?

2 个答案:

答案 0 :(得分:0)

在检查Attributes课程的方法后,我注意到getAll()方法。进一步搜索后,我能够实现以下功能,现在允许您使用&#34; *&#34;作为记录类型并打印所有记录。

Attributes attrs = idc.getAttributes("netnix.org", new String[] { "*" });
NamingEnumeration<?> ae = attrs.getAll();

while (ae.hasMore()) {
  Attribute attr = (Attribute)ae.next();
  for (int i = 0; i < attr.size(); i++) {
    Object a = attr.get(i);
    if (a instanceof String) {
      System.out.println(attr.getID() + " " + a);
    }
    else {
      System.out.println(attr.getID() + " NOT ASCII");
    }
  }
}
ae.close();

答案 1 :(得分:0)

你在这里发明了语义。 JNDI中"* *"的任何地方都不支持作为属性集或属性名称。 &#39;所有属性的正确语法&#39;设置为返回的属性为"*",并且枚举它们的正确方法是Attributes.getAll()