C#中使用第三方库的NSLookup
NSLookup using third party library in c#
我正在使用这个 c# librabry 的 nslookup 来查找 domains.Here 的名称服务器是我的 c# 代码
public async System.Threading.Tasks.Task<List<NS>> RunCmd(params string[] domains)
{
List<NS> NSL = new List<NS>();
var lookup = new LookupClient();
lookup.EnableAuditTrail = true;
foreach (var item in domains)
{
var result = await lookup.QueryAsync(item, QueryType.NS);
// rootDomain = result.AllRecords.FirstOrDefault().DomainName.Value;
var nameServer = result.AuditTrail;
var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;
NSL.Add(new NS { domainName=item,nameServers= record});
}
var workbook = new XLWorkbook();
workbook.AddWorksheet("sheetName");
var ws = workbook.Worksheet("sheetName");
int row = 1;
foreach (var item in NSL)
{
ws.Cell("A" + row.ToString()).Value = item.domainName.ToString();
ws.Cell("B" + row.ToString()).Value = item.nameServers.ToString();
row++;
}
string folderPath = "D:\";
workbook.SaveAs(folderPath+"nameServer.xlsx");
return NSL;
}
所以我传递了一个域数组,我需要知道这些域的名称服务器并且 return 它们在列表中也将它们写入本地 directory.I 中的 excel 文件'直接从响应 (var nameServer) 中获取名称服务器,所以我使用正则表达式根据我当前的正则表达式从 string.So 中拆分名称服务器,如果它们是 ns1 和 ns2 如果它们是除了这个之外的任何东西,比如 ns1262 或 ns2636 我只是从正则表达式中得到一个空字符串。
这是我在变量 nameServer
中得到的两个不同的示例响应
; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29412
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
mobilecellvideo.com. IN NS
;; ANSWER SECTION:
mobilecellvideo.com. 66306 IN NS ns2.mobilecellvideo.com.
mobilecellvideo.com. 66306 IN NS ns1.mobilecellvideo.com.
;; Query time: 132 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 02:55:38 GMT
;; MSG SIZE rcvd: 73
对于下面的响应,当我尝试匹配上面的正则表达式时,我只得到一个空字符串
; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29414
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
networkwonder.com. IN NS
;; ANSWER SECTION:
networkwonder.com. 300 IN NS ns2626.ztomy.com.
networkwonder.com. 300 IN NS ns1626.ztomy.com.
;; Query time: 436 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 03:09:01 GMT
;; MSG SIZE rcvd: 83
任何帮助将不胜感激
提前致谢!
您需要更改正则表达式
var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;
至:
var record = Regex.Match(nameServer.ToString(), @"ns\d+"+ "."+ item).Value;
当您将加号添加到 \d 时,您正在寻找 一个或无限位数字。
您可以使用 Regex101 检查您的正则表达式。
更新
我有点惊讶这个解决方案没有帮助你,所以我试着修复你的代码。
在我的例子中,输入是google.es,所以在下面的代码中:
foreach (var item in domains)
、item=="google.es"
并且 DNS 答案是:
; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 10049
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
google.es. IN NS
;; ANSWER SECTION:
google.es. 86399 IN NS ns2.google.com.
google.es. 86399 IN NS ns3.google.com.
google.es. 86399 IN NS ns4.google.com.
google.es. 86399 IN NS ns1.google.com.
;; Query time: 74 msec
;; SERVER: 8.8.8.8#53
;; WHEN: Mon, 13 Mar 2017 20:54:34 GMT
;; MSG SIZE rcvd: 120
正则表达式为ns\d+.google.es。如您所见,错误出在正则表达式中,因为您正在使用该项目构建正则表达式,而您要检查的域可以是 DNS 的其他域(这里我要求 google.es 但是 DNS 使用 google.com)
如果你想使用正则表达式,你可以使用下面的ns\d+.+,结果如下:
希望对您有所帮助
绝对没有必要再次尝试通过正则表达式从 result.AuditTrail
属性 中提取信息。
AuditTrail
仅用于记录信息!您想要的所有数据都已在结果中,DnsClient.NET 库为您提供所有内容的强类型结果。
This is所有你得到的结果。答案、权威等列表...
DnsQueryResponse 是您应该使用的实际 DNS 结果。
根据您提出的问题,相关数据可能位于“答案”、“附加”或“权威”中。
你的错误是(查看注释代码),你试图检查所有记录上的 DomainName
字符串以找到你的 NS 名称,但这不是找到它们的地方;)
DomainName
用于任何事情,主要是查询。
每条记录都有自己的字段来存储记录特定数据,NsRecord.
也是如此。
因此,下面的示例为您提供了 ns 记录和您想要的 ns 名称
var lookup = new LookupClient();
var result = await lookup.QueryAsync("google.com", QueryType.NS);
foreach(var nsRecord in result.Answers.NsRecords())
{
Console.WriteLine(nsRecord.NSDName);
}
这将打印类似
的内容
ns4.google.com.
ns1.google.com.
ns3.google.com.
ns2.google.com.
希望对您有所帮助
我正在使用这个 c# librabry 的 nslookup 来查找 domains.Here 的名称服务器是我的 c# 代码
public async System.Threading.Tasks.Task<List<NS>> RunCmd(params string[] domains)
{
List<NS> NSL = new List<NS>();
var lookup = new LookupClient();
lookup.EnableAuditTrail = true;
foreach (var item in domains)
{
var result = await lookup.QueryAsync(item, QueryType.NS);
// rootDomain = result.AllRecords.FirstOrDefault().DomainName.Value;
var nameServer = result.AuditTrail;
var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;
NSL.Add(new NS { domainName=item,nameServers= record});
}
var workbook = new XLWorkbook();
workbook.AddWorksheet("sheetName");
var ws = workbook.Worksheet("sheetName");
int row = 1;
foreach (var item in NSL)
{
ws.Cell("A" + row.ToString()).Value = item.domainName.ToString();
ws.Cell("B" + row.ToString()).Value = item.nameServers.ToString();
row++;
}
string folderPath = "D:\";
workbook.SaveAs(folderPath+"nameServer.xlsx");
return NSL;
}
所以我传递了一个域数组,我需要知道这些域的名称服务器并且 return 它们在列表中也将它们写入本地 directory.I 中的 excel 文件'直接从响应 (var nameServer) 中获取名称服务器,所以我使用正则表达式根据我当前的正则表达式从 string.So 中拆分名称服务器,如果它们是 ns1 和 ns2 如果它们是除了这个之外的任何东西,比如 ns1262 或 ns2636 我只是从正则表达式中得到一个空字符串。
这是我在变量 nameServer
中得到的两个不同的示例响应; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29412
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
mobilecellvideo.com. IN NS
;; ANSWER SECTION:
mobilecellvideo.com. 66306 IN NS ns2.mobilecellvideo.com.
mobilecellvideo.com. 66306 IN NS ns1.mobilecellvideo.com.
;; Query time: 132 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 02:55:38 GMT
;; MSG SIZE rcvd: 73
对于下面的响应,当我尝试匹配上面的正则表达式时,我只得到一个空字符串
; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 29414
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
networkwonder.com. IN NS
;; ANSWER SECTION:
networkwonder.com. 300 IN NS ns2626.ztomy.com.
networkwonder.com. 300 IN NS ns1626.ztomy.com.
;; Query time: 436 msec
;; SERVER: 106.51.113.3#53
;; WHEN: Mon, 13 Mar 2017 03:09:01 GMT
;; MSG SIZE rcvd: 83
任何帮助将不胜感激
提前致谢!
您需要更改正则表达式
var record = Regex.Match(nameServer.ToString(), @"ns\d"+ "."+ item).Value;
至:
var record = Regex.Match(nameServer.ToString(), @"ns\d+"+ "."+ item).Value;
当您将加号添加到 \d 时,您正在寻找 一个或无限位数字。
您可以使用 Regex101 检查您的正则表达式。
更新
我有点惊讶这个解决方案没有帮助你,所以我试着修复你的代码。
在我的例子中,输入是google.es,所以在下面的代码中:
foreach (var item in domains)
、item=="google.es"
并且 DNS 答案是:
; (2 server found)
;; Got answer:
;; ->>HEADER<<- opcode: Query, status: No Error, id: 10049
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
google.es. IN NS
;; ANSWER SECTION:
google.es. 86399 IN NS ns2.google.com.
google.es. 86399 IN NS ns3.google.com.
google.es. 86399 IN NS ns4.google.com.
google.es. 86399 IN NS ns1.google.com.
;; Query time: 74 msec
;; SERVER: 8.8.8.8#53
;; WHEN: Mon, 13 Mar 2017 20:54:34 GMT
;; MSG SIZE rcvd: 120
正则表达式为ns\d+.google.es。如您所见,错误出在正则表达式中,因为您正在使用该项目构建正则表达式,而您要检查的域可以是 DNS 的其他域(这里我要求 google.es 但是 DNS 使用 google.com)
如果你想使用正则表达式,你可以使用下面的ns\d+.+,结果如下:
希望对您有所帮助
绝对没有必要再次尝试通过正则表达式从 result.AuditTrail
属性 中提取信息。
AuditTrail
仅用于记录信息!您想要的所有数据都已在结果中,DnsClient.NET 库为您提供所有内容的强类型结果。
This is所有你得到的结果。答案、权威等列表...
DnsQueryResponse 是您应该使用的实际 DNS 结果。 根据您提出的问题,相关数据可能位于“答案”、“附加”或“权威”中。
你的错误是(查看注释代码),你试图检查所有记录上的 DomainName
字符串以找到你的 NS 名称,但这不是找到它们的地方;)
DomainName
用于任何事情,主要是查询。
每条记录都有自己的字段来存储记录特定数据,NsRecord.
因此,下面的示例为您提供了 ns 记录和您想要的 ns 名称
var lookup = new LookupClient();
var result = await lookup.QueryAsync("google.com", QueryType.NS);
foreach(var nsRecord in result.Answers.NsRecords())
{
Console.WriteLine(nsRecord.NSDName);
}
这将打印类似
的内容
ns4.google.com.
ns1.google.com.
ns3.google.com.
ns2.google.com.
希望对您有所帮助