Elixir - 进行 DNS 查询(使用 dig 命令)

Ден*_*орх 0 elixir

我需要创建一个 DNS 请求并获得响应。我在 Linux(Ubuntu) 中运行此命令以发送请求并获得响应:

dig +nocmd google.com txt +noall +answer
Run Code Online (Sandbox Code Playgroud)

回复:

google.com.             3400    IN      TXT     "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
google.com.             100     IN      TXT     "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
google.com.             100     IN      TXT     "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
google.com.             3400    IN      TXT     "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
google.com.             3400    IN      TXT     "v=spf1 include:_spf.google.com ~all"
Run Code Online (Sandbox Code Playgroud)

我可以在 Elixir 中使用dig命令吗?也许有一些库可以帮助我解决这个问题。不幸的是,到目前为止我还没有找到这样的库。我会很感激你的帮助。

Hau*_*eth 5

虽然您可以使用 shelldig或其他 DNS 解析命令,但最好使用 Erlang 中内置的 DNS 解析功能:

{:ok, res} = :inet_res.nslookup('google.com', :in, :txt)
txt_rr =
  res
  |> :inet_dns.msg()
  |> Keyword.fetch!(:enlist)
  |> Enum.map(&:inet_dns.rr/1)
Run Code Online (Sandbox Code Playgroud)

将导致:

[
  [
    domain: 'google.com',
    type: :txt,
    class: :in,
    ttl: 94,
    data: ['globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8=']
  ],
  [
    domain: 'google.com',
    type: :txt,
    class: :in,
    ttl: 94,
    data: ['facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95']
  ],
  [
    domain: 'google.com',
    type: :txt,
    class: :in,
    ttl: 94,
    data: ['docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e']
  ],
  [
    domain: 'google.com',
    type: :txt,
    class: :in,
    ttl: 94,
    data: ['docusign=1b0a6754-49b1-4db5-8540-d2c12664b289']
  ],
  [
    domain: 'google.com',
    type: :txt,
    class: :in,
    ttl: 94,
    data: ['v=spf1 include:_spf.google.com ~all']
  ]
]
Run Code Online (Sandbox Code Playgroud)