5个版本
0.4.1 | 2024年6月27日 |
---|---|
0.4.0 | 2024年6月27日 |
0.3.3 | 2024年4月7日 |
0.3.2 | 2024年4月7日 |
0.3.1 | 2023年10月16日 |
#514 in 网络编程
26KB
321 代码行
dug
名称解析聚合器
概要
用法: dug [选项] <主机名>...
选项
以下选项可用
Arguments:
[HOSTNAMES]...
Options:
-a, --ascii Format results as simple ASCII text
-j, --json Format results as structured JSON text
-h, --help Print help
-V, --version Print version
描述
dug
设计为一种全面的名称查找工具,使用工具或系统上可用的任何方法查找给定的主机名。
使用的一些方法/来源包括
- 本地主机的配置解析器
- 例如,gethostname(3),gethostbyname(3),getnameinfo(3)等。
- 主要公共DNS解析器
- Cloudflare
- Quad9
- 模拟nslookup
- 通过解析
/etc/resolv.conf
(如果存在)并查询找到的主机来实现。 - 可能与基于操作系统解析的结果有显著不同。
- 通过解析
dug
还将使用外部工具,如dig
(来自BIND9)或drill
(来自ldns),如果它们在$PATH
中找到。
尽可能并发尝试解析器,并将结果汇总为ASCII视图或适合由jq消费的JSON输出。有关更多信息,请参阅选项。
安装
从源代码构建
如果您已经安装了Rust工具链,您只需
cargo install dug
安装Rust工具链的最简单方法是使用rustup。
github
即将推出。
示例
示例:表格输出
$ dug wikipedia.org www.kame.net
┌wikipedia.org─────────────────┬────────────────────┐
│ Quad9 DNS │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ Google DNS │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ Cloudflare DNS │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ OS resolution │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ simulated nslookup │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ resolv.conf server[10.0.0.1] │ 198.35.26.96 │
├──────────────────────────────┼────────────────────┤
│ dig │ 198.35.26.96 │
│ │ 2620:0:863:ed1a::1 │
├──────────────────────────────┼────────────────────┤
│ drill │ 198.35.26.96 │
│ │ 2620:0:863:ed1a::1 │
└──────────────────────────────┴────────────────────┘
┌www.kame.net──────────────────┬────────────────────────────────────┐
│ Google DNS │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ Quad9 DNS │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ Cloudflare DNS │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ OS resolution │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ simulated nslookup │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ resolv.conf server[10.0.0.1] │ 210.155.141.200 │
├──────────────────────────────┼────────────────────────────────────┤
│ dig │ mango.itojun.org. │
│ │ 210.155.141.200 │
│ │ mango.itojun.org. │
│ │ 2001:2f0:0:8800:226:2dff:fe0b:4311 │
│ │ 2001:2f0:0:8800::1:1 │
├──────────────────────────────┼────────────────────────────────────┤
│ drill │ mango.itojun.org. │
│ │ 210.155.141.200 │
│ │ mango.itojun.org. │
│ │ 2001:2f0:0:8800::1:1 │
│ │ 2001:2f0:0:8800:226:2dff:fe0b:4311 │
└──────────────────────────────┴────────────────────────────────────┘
示例:JSON输出
$ dug --json wikipedia.org
[
{
"name": "aws.amazon.com",
"source": "Quad9 DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "Cloudflare DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "Google DNS",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "OS resolution",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "simulated nslookup",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "resolv.conf server[10.0.0.1]",
"records": [
"18.155.190.47"
]
},
{
"name": "aws.amazon.com",
"source": "resolv.conf server[127.0.0.1]",
"failure": "Timed out after 7s"
},
{
"name": "aws.amazon.com",
"source": "A (dig)",
"records": [
"tp.8e49140c2-frontier.amazon.com.",
"dr49lng3n1n2s.cloudfront.net.",
"18.155.190.47"
]
}
]
示例:ASCII文本输出
$ dug -a wikipedia.org
Name: wikipedia.org
Source: Cloudflare DNS
Result: 198.35.26.96
Name: wikipedia.org
Source: Quad9 DNS
Result: 198.35.26.96
Name: wikipedia.org
Source: Google DNS
Result: 198.35.26.96
Name: wikipedia.org
Source: OS resolution
Result: 198.35.26.96
Name: wikipedia.org
Source: simulated nslookup
Result: 198.35.26.96
Name: wikipedia.org
Source: resolv.conf server[10.0.0.1]
Result: 198.35.26.96
Name: wikipedia.org
Source: dig
Result: 198.35.26.96 2620:0:863:ed1a::1
Name: wikipedia.org
Source: drill
Result: 198.35.26.96 2620:0:863:ed1a::1
示例:获取一组主机名的Google DNS结果
$ dug -j abc.com cbs.com nbc.com | jq -cr \
'map(select(.source | contains("Google")))[] | "\(.name)\t\(.records | join(" "))"'
abc.com 65.8.161.63 65.8.161.31 65.8.161.4 65.8.161.47
cbs.com 34.149.41.86
nbc.com 23.67.33.102 23.67.33.74
示例:使用jq
提取解析的IP
$ dug -j google.com | jq -r 'map(select(.records).records) | flatten | unique .[]'
142.250.189.174
142.250.191.78
142.251.46.206
172.217.164.110
2607:f8b0:4005:814::200e
看起来很繁忙,但这里是 jq
在做什么
map(...)
— 对于数组中的每个结果...select(.records)
— 仅选择那些records
属性为真(移除null
)的对象.records
— ...并从选定的对象中提取records
属性flatten
将嵌套数组合并成一个包含所有解析 IP 的单个数组unique
— 移除所有重复值.[]
— 将数组转换为每行一个字符串的序列
依赖
~18–29MB
~526K SLoC