在脚本中解析 DNS 地址的可靠方法(IPv4 (A) 和 IPv6 (AAAA))?

Ama*_*rus 6 domain-name-system bash shell-scripting

我在 bash 变量 ( ) 中有一个域名$TARGET,并且我想以可靠的A方式在 bash 脚本中获取它的 IPv4(记录)地址(我还想获取 IPv6AAAA记录(如果存在))。

即 bash/unix 命令将: (i) 打印 DNS 解析的 IP 地址(并​​且是 IP 地址) (ii) 如果没有找到该域的 DNS 记录,则不向 stdout 打印任何内容(或非零退出) (iii) 让我选择索取AAAAA记录。

host "$TARGET"打印出很多人类可读的内容,但我不愿意解析它们。

dig +short看起来很有希望,但在某些情况下,它还会打印我不理解或不关心的其他警告消息。

$ dig +short -t A "$TARGET"
;; Warning: Client COOKIE mismatch
1.2.3.4
Run Code Online (Sandbox Code Playgroud)

Debian 测试/书呆子。Bash v5.2(通过 apt 安装)

fue*_*ero 11

我不确定您是否想实际查询名称服务器还是依赖系统的名称解析:

$ getent ahosts one.one.one.one. | awk '{ print $1 }' | sort -u
1.0.0.1
1.1.1.1
2606:4700:4700::1001
2606:4700:4700::1111
$ getent ahosts nonexistent.host | awk '{ print $1 }' | sort -u
$ getent ahosts www.what-is-my-ipv4.com | awk '{ print $1 }' | sort -u
185.26.156.187
Run Code Online (Sandbox Code Playgroud)

ahostsv4您还可以使用和使其返回 v4 或 v6 地址ahostsv6

如果您只是使用hosts,则需遵守您的/etc/gai.conf设置。

在https://unix.stackexchange.com/questions/212897/nslookup-dig-firefox-ignoring-etc-hosts-file-entries上找到了这个:

nslookupdig、 和host是用于查询 DNS 名称服务器的工具。

如果您的配置不是由名称服务器提供的(如 /etc/hosts 中给出的信息),这些工具将不会显示它们,因为它们直接询问名称服务器。

如果您想检查“通常”分辨率是否有效(即中指定的方式/etc/nsswitch.conf),您可以使用getent

getent hosts www.winaproduct.com
Run Code Online (Sandbox Code Playgroud)


JG7*_*JG7 7

您走在正确的轨道上dig。您可以抑制特定的 cookie 相关错误(根据手册页)。下面,我还选择将所有错误重定向到/dev/null以防万一,因为您希望失败保持沉默。

[jg7@comp1 ~]$ TARGET="google.com"

[jg7@comp1 ~]$ dig +short +nobadcookie -t A "$TARGET" @8.8.8.8 2>/dev/null
64.233.177.139
64.233.177.138
64.233.177.101
64.233.177.113
64.233.177.100
64.233.177.102

[jg7@comp1 ~]$ dig +short +nobadcookie -t AAAA "$TARGET" @8.8.8.8 2>/dev/null
2607:f8b0:4002:c08::65
2607:f8b0:4002:c08::8a
2607:f8b0:4002:c08::64
2607:f8b0:4002:c08::71
Run Code Online (Sandbox Code Playgroud)

如果这不是您要找的,请告诉我。

[编辑] 使用 bash 变量以便更接近原始问题。


use*_*686 7

getent ahosts[v4|v6]一般来说,使用 getaddrinfo() 的任何内容都是正确的答案,因为它将使用与系统其余部分相同的名称解析机制(DNS、mDNS、NetBIOS、NIS、LDAP\xe2\x80\xa6),并执行domain与系统其余部分相同的后缀搜索(即 resolv.conf )。

\n

例如,如果 getent 不可用,您可以执行以下操作:

\n
gaiv4="import sys, socket\nres = socket.getaddrinfo(sys.argv[1], 0, socket.AF_INET, socket.SOCK_STREAM)\nfor e in res: print(e[4][0])"\npython -c "$gaiv4" serverfault.com\n
Run Code Online (Sandbox Code Playgroud)\n

我通常出于其他原因安装了 ndisc6 软件包,并且它恰好有name2addr

\n
name2addr -m -4 www.google.com\n
Run Code Online (Sandbox Code Playgroud)\n