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
    • Google
    • 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 在做什么

  1. map(...) — 对于数组中的每个结果...
  2. select(.records) — 仅选择那些 records 属性为真(移除 null)的对象
  3. .records — ...并从选定的对象中提取 records 属性
  4. flatten 将嵌套数组合并成一个包含所有解析 IP 的单个数组
  5. unique — 移除所有重复值
  6. .[] — 将数组转换为每行一个字符串的序列

依赖

~18–29MB
~526K SLoC