我在 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:
nslookup
、dig
和host
是用于查询 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"