【问题标题】:Elixir - Making DNS Queries (Using dig command)Elixir - 进行 DNS 查询(使用 dig 命令)
【发布时间】:2022-01-15 11:05:04
【问题描述】:

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

dig +nocmd google.com txt +noall +answer

回复:

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"

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

【问题讨论】:

  • 你看过System.cmd/3吗?如果你想使用dig,那可能是你最好的选择。
  • @JustinWood System.cmd("whoami", []) - 例如,这个命令有效,但是当我尝试运行 System.cmd("dig +nocmd google.com txt +noall +answer ", []) 我有一个错误:"(ErlangError) Erlang 错误: :enoent. (elixir 1.10.2) lib/system.ex:795: System.cmd("dig +nocmd google.com txt +noall +answer ", [], [])"
  • "dig" |> System.cmd(~w|+nocmd google.com txt +noall +answer|) |> elem(0) |> IO.puts()

标签: elixir


【解决方案1】:

虽然您可以使用 dig 或其他 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)

结果是:

[
  [
    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']
  ]
]

【讨论】:

    【解决方案2】:

    您可以使用System.cmd 喜欢:

    {result, _status} =
      System.cmd(
        "dig",
        ["+nocmd", "google.com", "txt", "+noall", "+answer"]
      )
    
    String.split(result, "\n", trim: true)
    |> Enum.map(&String.split(&1, "\t", trim: true))
    

    你会得到类似的东西

    [
      ["google.com.", "3599", "IN", "TXT", "\"globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8=\""],
      ["google.com.", "3599", "IN", "TXT", "\"facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95\""],
      ["google.com.", "3599", "IN", "TXT", "\"v=spf1 include:_spf.google.com ~all\""],
      ["google.com.", "299", "IN", "TXT", "\"docusign=1b0a6754-49b1-4db5-8540-d2c12664b289\""],
      ["google.com.", "299", "IN", "TXT", "\"docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e\""]
    ]
    

    【讨论】:

      【解决方案3】:

      由于inet_res.nslookup 是deprecated,这里有两种选择:

      你可以使用lookup/3,看起来更方便:

      > :inet_res.lookup('google.com', :in, :txt)
      [
        ['docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e'],
        ['apple-domain-verification=30afIBcvSuDV2PLX'],
        ['globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8='],
        ['docusign=1b0a6754-49b1-4db5-8540-d2c12664b289'],
        ['v=spf1 include:_spf.google.com ~all'],
        ['google-site-verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o'],
        ['facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95'],
        ['google-site-verification=TV9-DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ'],
        ['MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB']
      ]
      

      或者,由于lookup/3在后台调用resolve/3,如果您需要例如,您可以直接调用resolve/3以获得更详细的体验。 TTL 或有错误消息以防出现问题:

      > :inet_res.resolve('google.com', :in, :txt)
      {:ok,
       {:dns_rec, {:dns_header, 3, true, :query, false, false, true, true, false, 0},
        [{:dns_query, 'google.com', :txt, :in, false}],
        [
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e'], :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['apple-domain-verification=30afIBcvSuDV2PLX'], :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8='],
           :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['docusign=1b0a6754-49b1-4db5-8540-d2c12664b289'], :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['v=spf1 include:_spf.google.com ~all'], :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['google-site-verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o'],
           :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95'],
           :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['google-site-verification=TV9-DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ'],
           :undefined, [], false},
          {:dns_rr, 'google.com', :txt, :in, 0, 690,
           ['MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB'], :undefined, [], false}
        ], [], []}}
      

      免责声明:我是灵药初学者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 2013-07-18
        • 2018-05-24
        • 2013-07-14
        • 2012-02-16
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        相关资源
        最近更新 更多