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

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

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

即哪个 bash/unix 命令将:(i)打印 IP 地址(和仅有的如果 DNS 解析没有找到该域的 DNS 记录,则在标准输出中不打印任何内容(或以非零形式退出);A如果AAAA...

host "$TARGET"打印大量人类可读的内容,我不愿意解析它们。

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

$ dig +short -t A "$TARGET"
;; Warning: Client COOKIE mismatch
1.2.3.4

Debian test/bookworm.Bash v5.2(通过 apt 安装)

答案1

我不确定您是否要实际查询名称服务器,或者更愿意依赖系统的名称解析:

$ 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

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

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

发现这个https://unix.stackexchange.com/questions/212897/nslookup-dig-firefox-ignoring-etc-hosts-file-entries

nslookupdighost是用于查询 DNS 名称服务器的工具。

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

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

getent hosts www.winaproduct.com

答案2

您使用 的方法是正确的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

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

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

答案3

getent ahosts[v4|v6]通常,任何使用 getaddrinfo() 的东西都是正确答案,因为它将使用与系统其余部分相同的名称解析机制(DNS,mDNS,NetBIOS,NIS,LDAP......),以及执行与系统其余部分相同的后缀搜索(即 resolv.conf domain)。

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

gaiv4="import sys, socket
res = socket.getaddrinfo(sys.argv[1], 0, socket.AF_INET, socket.SOCK_STREAM)
for e in res: print(e[4][0])"
python -c "$gaiv4" serverfault.com

我通常因为其他原因安装 ndisc6 包,并且它恰好具有name2addr

name2addr -m -4 www.google.com

答案4

我想你正在寻找

    dig +nocomments +short -t A "$TARGET"

或更好

    dig +noall +short -t A "$TARGET"

相关内容