Elixir - Создание DNS-запросов (с помощью команды dig) - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужно создать 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"

Можно ли использовать dig команда в эликсире? Возможно, есть библиотеки, которые могут помочь мне решить эту проблему. К сожалению, до сих пор мне не удалось найти такие библиотеки. Буду признателен за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

В то время как вы можете использовать dig или другую команду разрешения DNS, лучше использовать встроенные функции разрешения DNS, встроенные в Erlang:

{: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']
  ]
]
1 голос
/ 02 апреля 2020

Вы можете использовать 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\""]
]
...