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



我需要创建一个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命令吗?也许有一些图书馆可以帮助我解决这个问题。不幸的是,到目前为止,我还没能找到这样的图书馆。我将感谢你的帮助。

虽然您可以使用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']
]
]

由于inet_res.nslookup已弃用,因此有两种替代方案:

你可以使用看起来更方便的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,如果您需要TTL或在出现问题时出现错误消息,则可以直接调用resolve/3以获得更详细的体验:

> :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}
], [], []}}

免责声明:我是一个长生不老药的初学者。

您可以像一样使用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""]
]

最新更新