Использует ли JNDI список поиска DNS?

#java #dns #jndi #srv

#java #dns #jndi #srv

Вопрос:

Я хотел бы использовать JNDI для поиска записей Kerberos SRV в локальной сети. Я пытаюсь угадать локальный домен, надеюсь, умными способами. Если это не удается, я хотел бы посмотреть обычную запись, например, _kerberos._tcp без какого-либо суффикса и полагаться на список поиска домена DNS, чтобы найти нужную запись. Это работает в Windows с nslookup -type=srv _kerberos._tcp и Linux с host -t srv _kerberos._tcp . Домен example.test добавлен, и запись найдена.

Вот пример программы для выполнения поиска DNS через JNDI:

 import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class JndiDnsTest {

    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Usage: "   JndiDnsTest.class.getName()  
                    " name record-types...");
            return;
        }
        String name = args[0];
        String[] recordTypes = new String[args.length - 1];
        System.arraycopy(args, 1, recordTypes, 0, args.length - 1);
        Hashtable<String, String> env = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
        try {
            DirContext ctx = new InitialDirContext(env);
            Attributes dnsQueryResult = ctx.getAttributes(name, recordTypes);
            if (dnsQueryResult == null) {
                System.out.println("Not found: '"   name   "'");
            }
            for (String rrType: recordTypes) {
                Attribute rr = dnsQueryResult.get(rrType);
                if (rr != null) {
                    for (NamingEnumeration<?> vals = rr.getAll(); vals.hasMoreElements();) {
                        System.out.print(rrType   "t");
                        System.out.println(vals.nextElement());
                    }
                }
            }
        } catch (NamingException e) {
            e.printStackTrace(System.err);
        }
        System.out.println("nThe DNS search list:");
        for (Object entry: sun.net.dns.ResolverConfiguration.open().searchlist()) {
            System.out.println(entry);
        }
        System.out.println("nsun.net.spi.nameservice.domain = "  
                System.getProperty("sun.net.spi.nameservice.domain"));
    }
}
  

Мне кажется, что JNDI выполняет только один поиск прямого имени. Не найдена запись, в которой вышеуказанные команды выполняются успешно. Кажется, он не использует список поиска DNS. Однако его содержимое правильно напечатано внизу.

С другой стороны, в документации по сетевым свойствам говорится, что

Если свойство sun.net.spi.nameservice.domain не определено, поставщик будет использовать любой домен или список поиска доменов, настроенный в конфигурации DNS платформы.

(Свойство не задано.) Версия Java — Sun Java 1.6.0_20.

Использует ли JNDI список поиска DNS или нет?

Ответ №1:

Это известная ошибка — http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6427214