有纯命令实现,和借助xbill.DNS实现的查询
DnsRecord 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DNSRecord {
private String name;
private int ttl;
private String type;
private String recordType;
private String value;
}
DNSUtil工具类
@Slf4j
public class DNSUtil {
/**
* digA记录,用dig命令实现
* 用逗号分隔
* cmd : dig baidu.com a +short | paste -sd ","
*
* @param domain 域
* @param nameServer 名称服务器
* @return {@link List}<{@link String}>
* @throws Exception 异常
*/
public static List<String> digA(String domain, String nameServer) throws Exception {
List<String> A_Records = digRecord(domain, nameServer, "A");
return A_Records;
}
/**
* digAAAA记录,用dig命令实现
*
* @param domain 域
* @param nameServer 名称服务器
* @return {@link List}<{@link String}>
* @throws Exception 异常
*/
public static List<String> digAAAA(String domain, String nameServer) throws Exception {
List<String> AAAA_Records = digRecord(domain, nameServer, "AAAA");
return AAAA_Records;
}
public static List<String> digNS(String domain, String nameServer) throws Exception {
List<String> NS_Records = digRecord(domain, nameServer, "NS");
return NS_Records;
}
/**
* 挖掘记录
* cmd : dig baidu.com @nameServer a +short | paste -sd ","
*
* @param domain 域
* @param nameServer 名称服务器
* @param recordType 记录类型
* @return {@link List}<{@link String}>
* @throws Exception 异常
*/
public static List<String> digRecord(String domain, String nameServer, String recordType) throws Exception {
String cmd;
if (StrUtil.isNotBlank(nameServer)) {
cmd = "dig " + domain + " @" + nameServer + " " + recordType + " +short | paste -sd \",\"";
} else {
cmd = "dig " + domain + " " + recordType + " +short | paste -sd \",\"";
}
String result;
if (ShellUtil.isLinux()) {
result = ShellUtil.runShell(cmd);
} else {
result = RuntimeUtil.execForStr(cmd);
}
List<String> records = StrUtil.split(result, StrUtil.COMMA);
//去除两端的空白
for (int i = 0; i < records.size(); i++) {
String record = records.get(i);
record = record.trim();
records.set(i, record);
}
return records;
}
public static List<DNSRecord> digFullRecord(String domain, String nameServer, String recordType) throws Exception {
String cmd;
if (StrUtil.isNotBlank(nameServer)) {
cmd = "dig +noall +answer " + domain + " @" + nameServer + " " + recordType;
} else {
cmd = "dig +noall +answer " + domain + " " + recordType;
}
String cmdResult = ShellUtil.runShell(cmd);
log.info(cmdResult);
List<DNSRecord> results = new ArrayList<>();
String[] lines = cmdResult.split("\n");
for (String line : lines) {
String[] fields = line.trim().split("\\s+");
if (fields.length == 5) {
DNSRecord result = new DNSRecord(fields[0], Integer.parseInt(fields[1]), fields[2], fields[3], fields[4]);
results.add(result);
}
}
return results;
}
/**
* dig A记录
*
* @param domain 域
* @param nameServer 名称服务器
* @return {@link Record[]}
* @throws Exception 异常
*/
public static List<String> digAbyNSLook(String domain, String nameServer) throws Exception {
Lookup lookup = new Lookup(domain, Type.A);
if (StrUtil.isNotBlank(nameServer)) {
SimpleResolver simpleResolver = new SimpleResolver(nameServer);
lookup.setResolver(simpleResolver);
}
Record[] records = lookup.run();
ArrayList<String> A_Addresses = new ArrayList<>();
for (Record record : records) {
ARecord aRecord = (ARecord) record;
String hostAddress = aRecord.getAddress().getHostAddress();
A_Addresses.add(hostAddress);
}
return A_Addresses;
}
/**
* dig AAAA记录
*
* @param domain 域
* @param isSfn 是sfn
* @param nameServer 名称服务器
* @return {@link Record[]}
* @throws Exception 异常
*/
public static List<String> digAAAAbyNSLook(String domain, String nameServer) throws Exception {
Lookup lookup = new Lookup(domain, Type.AAAA);
if (StrUtil.isNotBlank(nameServer)) {
SimpleResolver simpleResolver = new SimpleResolver(nameServer);
lookup.setResolver(simpleResolver);
}
Record[] records = lookup.run();
// String cmd="dig "+domain+" AAAA +short";
// String result = ShellUtil.runShell(cmd);
ArrayList<String> AAAA_Addresses = new ArrayList<>();
if (ObjectUtil.isNotNull(records)) {
for (Record record : records) {
AAAARecord aaaaRecord = (AAAARecord) record;
String hostAddress = aaaaRecord.getAddress().getHostAddress();
AAAA_Addresses.add(hostAddress);
}
}
return AAAA_Addresses;
}
}