host 命令详解与参数实测(Ubuntu 22.04)
以 Ubuntu 22.04(bind9-dnsutils 9.18.39)实测逐参数讲解 host 命令:-t a/aaaa/mx/ns/txt/soa/cname/ptr 等记录类型、-a/-v/-d、-4/-6、-W/-R、-T/-U、-p、-c/-l/-C/-r/-s/-N/-m 全部选项与真实回显,覆盖 NXDOMAIN 退出码、指定查询服务器、区域传送失败现象与 dig/nslookup 三方对比。
host 命令详解与参数实测(Ubuntu 22.04)
目标:全面掌握 host 的每一个常用参数——
-t指定 A/AAAA/MX/NS/TXT/SOA/CNAME/PTR 等记录类型、-a/-v/-d全记录与详细模式、-4/-6传输族、-W超时与-R重试、-T/-U强制协议、-p指定端口、-c/-l/-C/-r/-s/-N/-m低频选项,以及指定查询服务器、NXDOMAIN 退出码、反向解析与区域传送的真实行为,全部命令与回显已在 Ubuntu 22.04(bind9-dnsutils 9.18.39)实测通过。
一、环境信息
本文所有命令均在以下真实服务器环境逐条执行并记录回显,读者可按相同条件复现:
- 操作系统:Ubuntu 22.04.5 LTS(
PRETTY_NAME="Ubuntu 22.04.5 LTS"),架构 x86_64,root 用户执行; - host 版本:
host 9.18.39-0ubuntu0.22.04.7-Ubuntu(软件包版本1:9.18.39-0ubuntu0.22.04.7); - 本机地址
172.17.0.2/16,默认网关172.17.0.1; - DNS 服务器:
192.168.146.2(取自/etc/resolv.conf的 nameserver 行,内网解析服务器;本文所有未指定服务器的 host 查询均发往它); - 对照工具版本:dig / nslookup 同为
DiG 9.18.39-0ubuntu0.22.04.7-Ubuntu(同属 bind9-dnsutils); - 演示目标选型:公网可解析域名
baidu.com、qq.com、www.baidu.com(A/AAAA/MX/NS/TXT/SOA/CNAME 全部有真实记录);公共 DNS 服务器223.5.5.5(阿里)、8.8.8.8(谷歌,用于反向解析演示);必败域名this-domain-does-not-exist-12345.invalid(.invalid是 RFC 2606 保留的永不存在 TLD,用于制造 NXDOMAIN)。
💡 说明:公网域名的 A 记录有多个值且解析结果按轮询顺序返回,本文各处回显中同一域名的 IP 顺序不同属正常现象,读者实测时数值顺序也会变化,但记录类型与格式完全一致。
二、命令概览
2.1 语法与测试数据
host 是 BIND 9 提供的简易 DNS 查询工具,用于把域名解析成 IP 地址(正向查询)或把 IP 地址解析成域名(反向查询),输出比 dig 简洁、比 nslookup 更适合脚本判断。语法(取自实测 usage 原文):
Usage: host [-aCdilrTvVw] [-c class] [-N ndots] [-t type] [-W time]
[-R number] [-m flag] [-p port] hostname [server]
hostname:必填,要查询的域名或 IP 地址(IP 会被自动按反向查询处理);[server]:可选的第二个位置参数,指定本次查询使用的 DNS 服务器(不填则读/etc/resolv.conf);- 各选项含义见 2.2 节逐行原文与第三章逐项实测。
本文测试数据约定:正向查询用 baidu.com / qq.com / www.baidu.com,反向查询用 8.8.8.8、223.5.5.5,必败场景统一用 this-domain-does-not-exist-12345.invalid。每个参数小节均可独立执行复现。
💡 技术拓展:BIND 套件里「查 DNS」不止 host 一个工具,常用三方对比——
工具 输出风格 默认查询类型 脚本友好度 定位 host 一行一条自然语言结果 自动(A/MX 等) 高:退出码可靠 快速验证某域名的解析 dig 类似 DNS 报文的分区格式 A 高:+short 提取答案 精细分析 DNS 应答全过程 nslookup 交互式起源、问答式输出 A 中:退出码行为差异大(见 3.20) 跨平台(Windows 自带)排障 本文实际采用 host:验证「这个域名能不能解析、解析成什么」时输出最短、可读性最好;需要看完整应答报文时再换 dig。
2.2 --help 全量输出(逐行照抄)
⚠️ host 不识别 --help 长选项:直接执行会报 illegal option 并打印用法,退出码 1。以下为 host --help 的完整实测输出(host 无参数时打印同一段 usage,见 [3] 对照):
$ host --help
host: illegal option -- -
Usage: host [-aCdilrTvVw] [-c class] [-N ndots] [-t type] [-W time]
[-R number] [-m flag] [-p port] hostname [server]
-a is equivalent to -v -t ANY
-A is like -a but omits RRSIG, NSEC, NSEC3
-c specifies query class for non-IN data
-C compares SOA records on authoritative nameservers
-d is equivalent to -v
-l lists all hosts in a domain, using AXFR
-m set memory debugging flag (trace|record|usage)
-N changes the number of dots allowed before root lookup is done
-p specifies the port on the server to query
-r disables recursive processing
-R specifies number of retries for UDP packets
-s a SERVFAIL response should stop query
-t specifies the query type
-T enables TCP/IP mode
-U enables UDP mode
-v enables verbose output
-V print version number and exit
-w specifies to wait forever for a reply
-W specifies how long to wait for a reply
-4 use IPv4 query transport only
-6 use IPv6 query transport only
退出码=1
关键差异解读:-a 是 -v -t ANY 的组合写法;-d 与 -v 完全等价;-w(等 forever)与 -W(等 wait,带秒数)是一对容易混淆的等待策略;-4/-6 控制的是「查询传输层」用的地址族,不是查询的记录类型。逐项实测见第三章。
2.3 版本信息
Ubuntu 22.04 中 host 的可执行文件属于 bind9-host 软件包,与 dig/nslookup 所在的 bind9-dnsutils 同源于 BIND 9.18 系列。实测版本与包归属确认:
$ host -V
host 9.18.39-0ubuntu0.22.04.7-Ubuntu
$ dpkg -S /usr/bin/host
bind9-host: /usr/bin/host
$ dpkg -l bind9-dnsutils | tail -1
ii bind9-dnsutils 1:9.18.39-0ubuntu0.22.04.7 amd64 Clients provided with BIND 9
⚠️ 注意:dpkg -S /usr/bin/host 显示二进制归属 bind9-host 包,但该包与 bind9-dnsutils 同版本号联动升级;日常用 apt install bind9-dnsutils 即可把 host/dig/nslookup 一并装齐(Ubuntu Server 最小安装通常已预装)。
三、参数逐项实测
3.1 无参数基础查询:host 域名
不带任何选项时,host 自动决定查询类型:有 A 记录就报 A,附带报 MX(邮件交换),一条命令看到最关心的两类记录。实测 baidu.com、www.baidu.com、qq.com:
host baidu.com
host www.baidu.com
host qq.com
实测回显:
$ host baidu.com
baidu.com has address 111.63.65.247
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.103
baidu.com has address 124.237.177.164
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 110.242.70.57
www.a.shifen.com has address 110.242.69.21
www.a.shifen.com has IPv6 address 2408:871a:2100:1b23:0:ff:b07a:7ebc
www.a.shifen.com has IPv6 address 2408:871a:2100:186c:0:ff:b07e:3fbc
退出码=0
$ host qq.com
qq.com has address 157.255.219.143
qq.com mail is handled by 20 mx2.qq.com.
qq.com mail is handled by 10 mx3.qq.com.
qq.com mail is handled by 30 mx1.qq.com.
退出码=0
输出句式解读:has address = A 记录(IPv4);has IPv6 address = AAAA 记录;is an alias for = CNAME 别名链(host 会自动跟随别名把最终地址也查出来);mail is handled by 优先级 服务器. = MX 记录,数字越小优先级越高。
💡 要点:www.baidu.com 的回显展示了完整的别名链行为——先报 CNAME(指向 www.a.shifen.com),再报别名自己的 A 与 AAAA。这就是大站 CDN 的典型结构:www 名字固定,实际解析随调度变化。
3.2 一次只能查一个名字:第二个位置参数是服务器不是第二个域名
⚠️ 这是 host 最常见的误用:以为可以像 ping 一样一次传多个域名。实测 host baidu.com qq.com:
host baidu.com qq.com
实测回显:
$ host baidu.com qq.com
;; communications error to 157.255.219.143#53: timed out
;; communications error to 157.255.219.143#53: timed out
;; no servers could be reached
退出码=1
失败原因:语法 [server] 表示第二个位置参数是查询用的 DNS 服务器。qq.com 解析出的 IP 157.255.219.143 被当成 DNS 服务器去连 53 端口,对方不提供 DNS 服务(或被过滤),UDP 等待超时两次后放弃。要查多个域名只能逐条执行。
💡 要点:communications error ... timed out + no servers could be reached 是「服务器不可用」类失败的固定组合,退出码 1;看到它先检查第二个位置参数是不是被误当成了服务器(以及 3.13 节的 -p 端口是否正确)。
3.3 -t a 与 -t aaaa:只要 IPv4 / 只要 IPv6
-t(--type 需写成 -t 类型)显式指定查询的记录类型。a 只要 IPv4 地址,aaaa 只要 IPv6 地址。类型名大小写不敏感(3.9 节实测 -t MX)。实测:
host -t a baidu.com
host -t a www.baidu.com
host -t aaaa www.baidu.com
host -t aaaa baidu.com
实测回显:
$ host -t a baidu.com
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
退出码=0
$ host -t a www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 110.242.69.21
www.a.shifen.com has address 110.242.70.57
退出码=0
$ host -t aaaa www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has IPv6 address 2408:871a:2100:1b23:0:ff:b07a:7ebc
www.a.shifen.com has IPv6 address 2408:871a:2100:186c:0:ff:b07e:3fbc
退出码=0
$ host -t aaaa baidu.com
baidu.com has no AAAA record
退出码=0
💡 要点:
-t aaaa baidu.com回显has no AAAA record且退出码仍是 0——「域名存在但无此类型记录」不是错误;对比 3.15 节域名本身不存在(NXDOMAIN)时退出码为 1。脚本判断时要区分这两种情况。-t a www.baidu.com仍会先报 CNAME 别名行:查询 A 时别名链是答案的一部分,无法跳过。
3.4 -t mx 与 -t ns:邮件交换与权威服务器
-t mx 查邮件交换记录(收这个域名的邮件该送到哪台服务器),-t ns 查权威名称服务器(这个域名的解析由谁应答)。实测:
host -t mx qq.com
host -t ns baidu.com
实测回显:
$ host -t mx qq.com
qq.com mail is handled by 20 mx2.qq.com.
qq.com mail is handled by 10 mx3.qq.com.
qq.com mail is handled by 30 mx1.qq.com.
退出码=0
$ host -t ns baidu.com
baidu.com name server ns7.baidu.com.
baidu.com name server ns2.baidu.com.
baidu.com name server ns3.baidu.com.
baidu.com name server dns.baidu.com.
baidu.com name server ns4.baidu.com.
退出码=0
💡 要点:MX 行格式 mail is handled by 优先级 主机名.,投递方按优先级从小到大尝试(qq.com 实际首选 mx3.qq.com);NS 行 name server 主机名.,末尾的点表示完整限定域名(FQDN)。配邮件域、排查「邮件发不到对方」时先看 MX。
3.5 -t txt 与 -t soa:SPF 文本记录与权威起点
-t txt 查文本记录(SPF 反垃圾邮件策略、域名归属证明等),-t soa 查权威区起点记录(主 NS、管理员邮箱、序列号等)。实测:
host -t txt qq.com
host -t soa baidu.com
实测回显:
$ host -t txt qq.com
qq.com descriptive text "v=spf1 include:spf.mail.qq.com ~all"
退出码=0
$ host -t soa baidu.com
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151573 300 300 2592000 600
退出码=0
SOA 七字段对照:dns.baidu.com. 主权威服务器;sa.baidu.com. 管理员邮箱(第一个点即 @,即 sa@baidu.com);2012151573 序列号(版本号,每次 zone 变更递增);300 刷新间隔(秒);300 重试间隔;2592000 过期时间;600 否定应答 TTL。
💡 要点:SPF 记录(v=spf1 ...)是邮件排障的高频检查项:收不到对方邮件时先 -t txt 对方域 看授权的发件 IP 范围;~all 表示软失败(未授权来源的邮件标记而非拒收)。
3.6 -t cname:别名记录
-t cname 查规范名(别名)记录。实测:
host -t cname www.baidu.com
实测回显:
$ host -t cname www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
退出码=0
💡 要点:CNAME 行 is an alias for 与基础查询里的别名行是同一条记录;-t cname 只看别名本身、不再跟随解析最终地址,适合确认「这个 www 名指到了哪个调度名」。
3.7 -t ptr 与反向查询:host IP
-t ptr 查指针记录(IP → 域名)。对 IP 直接查询时 host 自动按反向查询处理(等价于 -t ptr),无需手工拼 in-addr.arpa。实测:
host -t ptr 8.8.8.8
host 8.8.8.8
host 223.5.5.5
实测回显:
$ host -t ptr 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer dns.google.
退出码=0
$ host 8.8.8.8(无参数反向查询)
8.8.8.8.in-addr.arpa domain name pointer dns.google.
退出码=0
$ host 223.5.5.5(无参数反向查询)
5.5.5.223.in-addr.arpa domain name pointer public1.alidns.com.
退出码=0
💡 要点:
- 反向查询的本质是查
四段倒序.in-addr.arpa这个特殊域:8.8.8.8→8.8.8.8.in-addr.arpa、223.5.5.5→5.5.5.223.in-addr.arpa,回显里能看到拼接结果。 domain name pointer 主机名.即 PTR 答案。邮件服务器反垃圾校验、日志溯源都会用到 PTR;公网 IP 没有 PTR 时回显 NXDOMAIN(同 3.15 形态,退出码 1)。
3.8 -t hinfo / -t caa / -t srv:低频记录类型实测
除上述高频类型外,-t 还能查任意 RFC 记录类型。实测多数公网域的三种低频类型表现:
host -t hinfo baidu.com
host -t caa qq.com
host -t srv _xmpp-server._tcp.qq.com
实测回显:
$ host -t hinfo baidu.com
baidu.com has no HINFO record
退出码=0
$ host -t caa qq.com
qq.com has no CAA record
退出码=0
$ host -t srv _xmpp-server._tcp.qq.com
Host _xmpp-server._tcp.qq.com not found: 3(NXDOMAIN)
退出码=1
三种现象对照:has no HINFO record = 域名存在但没有这种记录(NOERROR 空答案,rc=0);has no CAA record 同理;Host ... not found: 3(NXDOMAIN) = 这个名字(SRV 的名字是 _服务._协议.域 拼出来的)根本不存在,rc=1。
💡 要点:「无记录(rc=0)」与「名字不存在(rc=1)」是两类不同结论:前者说明域名注册且 DNS 正常、只是没配这种类型;后者连名字都没有。SRV 记录名必须按 _服务._协议.域名 构造,直接查 qq.com 的 SRV 是查不到的。
3.9 -t 大小写不敏感验证
记录类型参数大小写均可。实测大写 MX:
host -t MX qq.com
实测回显:
$ host -t MX qq.com
qq.com mail is handled by 20 mx2.qq.com.
qq.com mail is handled by 30 mx1.qq.com.
qq.com mail is handled by 10 mx3.qq.com.
退出码=0
💡 要点:-t MX 与 -t mx 结果等价(仅返回顺序因服务器轮询而异);文档与脚本里建议统一小写,避免风格混乱。
3.10 -a:全记录查询(等价 -v -t ANY)
-a 一次性查询该名字的全部记录类型,输出切换为 dig 风格的报文格式(首行 Trying "域名" 提示正在查询)。实测:
host -a baidu.com
实测回显:
$ host -a baidu.com
Trying "baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23705
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;baidu.com. IN ANY
;; ANSWER SECTION:
baidu.com. 5 IN MX 10 mx.maillb.baidu.com.
baidu.com. 5 IN MX 20 mx.baidu.com.
baidu.com. 5 IN A 124.237.177.164
baidu.com. 5 IN A 110.242.74.102
baidu.com. 5 IN A 111.63.65.103
baidu.com. 5 IN A 111.63.65.247
baidu.com. 5 IN NS ns2.baidu.com.
baidu.com. 5 IN NS dns.baidu.com.
baidu.com. 5 IN NS ns4.baidu.com.
baidu.com. 5 IN NS ns7.baidu.com.
baidu.com. 5 IN NS ns3.baidu.com.
Received 226 bytes from 192.168.146.2#53 in 4 ms
退出码=0
字段解读:status: NOERROR 应答状态;flags: qr rd ra 应答/期望递归/递归可用标志位;ANSWER SECTION 每行 = 名字 TTL IN 类型 值(TTL 5 秒说明该解析结果缓存时间极短);最后一行 Received 226 bytes from 192.168.146.2#53 是应答来源服务器与字节数。
💡 要点:-a 的输出与 dig 几乎同构,排障时想看 TTL、来源服务器、应答报文细节就用它;只关心答案时用默认形态或 -t。
3.11 -A:-a 的去签名版
-A 与 -a 同为 ANY 查询,但省略 DNSSEC 相关的 RRSIG/NSEC/NSEC3 记录,答案更干净。实测:
host -A baidu.com
实测回显:
$ host -A baidu.com
Trying "baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31507
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;baidu.com. IN ANY
;; ANSWER SECTION:
baidu.com. 5 IN MX 20 mx.baidu.com.
baidu.com. 5 IN MX 10 mx.maillb.baidu.com.
baidu.com. 5 IN A 124.237.177.164
baidu.com. 5 IN A 111.63.65.247
baidu.com. 5 IN A 110.242.74.102
baidu.com. 5 IN A 111.63.65.103
baidu.com. 5 IN NS dns.baidu.com.
baidu.com. 5 IN NS ns4.baidu.com.
baidu.com. 5 IN NS ns7.baidu.com.
baidu.com. 5 IN NS ns3.baidu.com.
baidu.com. 5 IN NS ns2.baidu.com.
Received 226 bytes from 192.168.146.2#53 in 3 ms
退出码=0
💡 要点:对已部署 DNSSEC 的域,-a 的 ANSWER 区会多出 RRSIG 签名记录而 -A 不会;本例 baidu.com 未返回签名记录,两者行数一致,差异只在有 DNSSEC 的域名上可辨。
3.12 -v 与 -d:详细模式(两者完全等价)
-v(verbose)按「逐类型跟随解析」的方式打出每个查询的完整报文;-d 在 usage 中标注 is equivalent to -v。实测两者:
host -v www.baidu.com
host -d www.baidu.com
实测回显(-v 全文,-d 输出与其一致仅 id/时间不同,关键段落对照):
$ host -v www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61510
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 5 IN CNAME www.a.shifen.com.
www.a.shifen.com. 5 IN A 110.242.70.57
www.a.shifen.com. 5 IN A 110.242.69.21
Received 93 bytes from 192.168.146.2#53 in 3 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58089
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.a.shifen.com. IN AAAA
;; ANSWER SECTION:
www.a.shifen.com. 5 IN AAAA 2408:871a:2100:186c:0:ff:b07e:3fbc
www.a.shifen.com. 5 IN AAAA 2408:871a:2100:1b23:0:ff:b07a:7ebc
Received 90 bytes from 192.168.146.2#53 in 2 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21182
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www.a.shifen.com. IN MX
;; AUTHORITY SECTION:
a.shifen.com. 5 IN SOA ns1.a.shifen.com. baidu_dns_master.baidu.com. 2610160027 5 5 2592000 3600
Received 97 bytes from 192.168.146.2#53 in 4 ms
退出码=0
$ host -d www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11479
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 5 IN CNAME www.a.shifen.com.
www.a.shifen.com. 5 IN A 110.242.69.21
www.a.shifen.com. 5 IN A 110.242.70.57
Received 90 bytes from 192.168.146.2#53 in 5 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27750
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.a.shifen.com. IN AAAA
;; ANSWER SECTION:
www.a.shifen.com. 5 IN AAAA 2408:871a:2100:1b23:0:ff:b07a:7ebc
www.a.shifen.com. 5 IN AAAA 2408:871a:2100:186c:0:ff:b07e:3fbc
Received 90 bytes from 192.168.146.2#53 in 5 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25544
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www.a.shifen.com. IN MX
;; AUTHORITY SECTION:
a.shifen.com. 5 IN SOA ns1.a.shifen.com. baidu_dns_master.baidu.com. 2610160038 5 5 2592000 3600
Received 97 bytes from 192.168.146.2#53 in 25 ms
退出码=0
解读:详细模式下 host 把一次「基础查询」拆成了三次真实查询——A(拿到 CNAME+A)、AAAA、MX(A 记录无 MX 时 AUTHORITY 区返回 SOA)。这与 3.1 默认输出「一屏汇总」是同一事实的两种视角。
💡 要点:-v/-d 是等价参数(usage 原文 is equivalent to -v),实测两段输出的查询序列完全一致(三次 Trying 的类型相同);仅应答报文 id、A/AAAA 段的 IP 顺序(服务器轮询)与毫秒耗时不同。排查「host 到底发了几个查询」时用它。
3.13 -W:等待应答的超时上限(秒)
-W 秒数 设置每次等待应答的超时上限。实测正常域与不可达服务器两种场景:
host -W 2 baidu.com
host -W 2 baidu.com 192.0.2.1
实测回显:
$ host -W 2 baidu.com
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host -W 2 baidu.com 192.0.2.1
;; communications error to 192.0.2.1#53: timed out
;; communications error to 192.0.2.1#53: timed out
;; no servers could be reached
退出码=1
192.0.2.0/24 是 RFC 5737 文档专用网段,不会有任何服务器应答,是制造「服务器超时」的标准靶子。超时打满后按重试次数(默认 2 次通信尝试)打印两条 communications error 再以 no servers could be reached 收尾。
💡 要点:脚本里必须用 -W 封顶等待时间,否则遇到无应答服务器会按默认策略反复等待拖慢整批任务;-w(小写,见 3.19)则是「永久等待」,脚本里禁用。
3.14 -R:UDP 重试次数
-R 次数 设置 UDP 包的重试次数(默认 2)。实测重试 3 次的正常查询,以及与 -W 组合控制「不可达服务器」的失败节奏:
host -R 3 baidu.com
host -R 1 -W 1 baidu.com 223.5.5.5
实测回显:
$ host -R 3 baidu.com
baidu.com has address 111.63.65.247
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com has address 110.242.74.102
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host -R 1 -W 1 baidu.com 223.5.5.5
Using domain server:
Name: 223.5.5.5
Address: 223.5.5.5#53
Aliases:
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 mx.baidu.com.
退出码=0
💡 要点:-R 与 -W 是控制 UDP 查询健壮性的一对参数:链路抖动时提高 -R,慢链路下配合 -W 拉长单次等待;对明确不可达的地址,-R 1 -W 1 能把失败判定压缩到约 1~2 秒,适合探测脚本。
3.15 NXDOMAIN:域名不存在的现象与退出码
用 RFC 2606 保留的 .invalid 顶级域构造必败查询,实测普通形态与 -a 形态的 NXDOMAIN(域名不存在)回显与退出码:
host this-domain-does-not-exist-12345.invalid
host -a this-domain-does-not-exist-12345.invalid
host -t a this-domain-does-not-exist-12345.invalid
实测回显:
$ host this-domain-does-not-exist-12345.invalid
Host this-domain-does-not-exist-12345.invalid not found: 3(NXDOMAIN)
退出码=1
$ host -a this-domain-does-not-exist-12345.invalid
Trying "this-domain-does-not-exist-12345.invalid"
Host this-domain-does-not-exist-12345.invalid not found: 3(NXDOMAIN)
Received 133 bytes from 192.168.146.2#53 in 4 ms
Received 133 bytes from 192.168.146.2#53 in 4 ms
退出码=1
$ host -t a this-domain-does-not-exist-12345.invalid
Host this-domain-does-not-exist-12345.invalid not found: 3(NXDOMAIN)
退出码=1
💡 要点:host 对 NXDOMAIN 统一输出 Host 名字 not found: 3(NXDOMAIN) 且退出码 1(3 是 DNS 应答码 rcode 的数值)。退出码可靠是 host 相对 dig 的核心优势:dig 查 NXDOMAIN 时 dig +short 为空输出但退出码仍为 0,脚本只能靠输出内容判断;host 直接 rc=1,if ! host -t a 域名 >/dev/null; then ... 即可。
3.16 -4 与 -6:强制查询传输地址族
-4/-6 控制 host 与 DNS 服务器通信用的 IP 协议族(不是查询记录的类型)。本机仅有 IPv4 出口,实测两者:
host -4 baidu.com
host -6 baidu.com
实测回显:
$ host -4 baidu.com
baidu.com has address 111.63.65.247
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.103
baidu.com has address 124.237.177.164
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host -6 baidu.com
;; communications error to ::1#53: connection refused
;; communications error to ::1#53: connection refused
;; no servers could be reached
退出码=1
💡 要点:-6 强制走 IPv6 传输后,本机没有 IPv6 出口,host 退回到 ::1(本机 IPv6 回环)找 DNS 服务进程,本机 53 端口无 IPv6 监听 → connection refused。双栈服务器上若需验证「IPv6 链路下的 DNS 解析」,host -6 域名 IPv6地址的DNS 才是完整形态;注意这与 3.3 的 -t aaaa(查记录类型)毫无关系。
3.17 -T 与 -U:强制 TCP / UDP 传输
-T 强制用 TCP 发查询(默认 UDP,应答超 512 字节才自动转 TCP),-U 强制 UDP。实测:
host -T baidu.com
host -U baidu.com
实测回显:
$ host -T baidu.com
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host -U baidu.com
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
💡 要点:两种协议对正常域结果一致;差异在故障场景——UDP 大应答被截断/丢包时 -T 往往能查通(TCP 53),而中间设备封 TCP 53 时 -U 反而是唯一通路。排障时两把都试是定位「传输层被干扰」的快速手段。
3.18 -p:指定查询端口
-p 端口 指定查询服务器的服务端口(默认 53)。实测正确端口与错误端口:
host -p 53 baidu.com 223.5.5.5
host -W 3 -p 853 baidu.com 223.5.5.5
实测回显:
$ host -p 53 baidu.com 223.5.5.5
Using domain server:
Name: 223.5.5.5
Address: 223.5.5.5#53
Aliases:
baidu.com has address 111.63.65.103
baidu.com has address 110.242.74.102
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.247
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
$ host -W 3 -p 853 baidu.com 223.5.5.5
;; communications error to 223.5.5.5#853: timed out
;; communications error to 223.5.5.5#853: timed out
;; no servers could be reached
退出码=1
💡 要点:853 是 DoT(DNS over TLS)端口,host 不做 TLS 封装,把明文 DNS 查询发往 853 自然无应答而超时——回显里 223.5.5.5#853 明确标出了「哪台服务器的哪个端口」失败。-p 的实际用途是测试自建 DNS 的非标准监听端口(如 dnsmasq 监听 5353 时 host -p 5353 域名 127.0.0.1)。
3.19 指定查询服务器:第二个位置参数与 Using domain server 提示
第二个位置参数直接指定 DNS 服务器,host 会先打印 Using domain server 块说明本次向谁查询(3.2 节已见误用形态,本节用正确地址):
host baidu.com 223.5.5.5
实测回显:
$ host baidu.com 223.5.5.5
Using domain server:
Name: 223.5.5.5
Address: 223.5.5.5#53
Aliases:
baidu.com has address 124.237.177.164
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.103
baidu.com has address 111.63.65.247
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
💡 要点:Using domain server 三行块是指定服务器形态的标志(与 3.2 失败回显对照可确认「host 确实把第二个参数当服务器用了」)。指定公共 DNS 与本地 DNS 结果不一致时,说明两边缓存/策略有差异,是 DNS 迁移演练的常用手法(见 4.2)。
3.20 -c:指定查询类(IN / CH)
-c 类 指定查询类(class),正常解析都是 IN(Internet),CH(Chaos)是 BIND 的信息类。实测两种:
host -c IN baidu.com
host -c CH baidu.com
实测回显:
$ host -c IN baidu.com
baidu.com has address 111.63.65.247
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com has address 110.242.74.102
退出码=0
$ host -c CH baidu.com
Host baidu.com not found: 5(REFUSED)
退出码=1
💡 要点:-c IN 与默认行为一致;-c CH 对普通域名得到 5(REFUSED)(rcode 5,服务器拒绝应答该类查询),退出码 1。CH 类在现代公共 DNS 上基本只用于返回版本号的特殊查询,日常无需使用。
3.21 -l:列出区域(AXFR 区域传送)
-l 域名 尝试对目标域做 AXFR 全量区域传送(把整个 zone 的所有记录拉下来)。公网权威服务器都会拒绝未授权传送,实测失败形态;-t axfr 显式请求同语义,一并实测:
host -l baidu.com
host -t axfr baidu.com
实测回显:
$ host -l baidu.com
Host baidu.com not found: 9(NOTAUTH)
; Transfer failed.
退出码=1
$ host -t axfr baidu.com
Trying "baidu.com"
Host baidu.com not found: 9(NOTAUTH)
; Transfer failed.
退出码=1
💡 要点:9(NOTAUTH) + Transfer failed. = 该服务器对此域无传送授权(安全策略正确生效的样子)。AXFR 只应在自己管理的 DNS 主从之间成功;自建 BIND 的主从同步排障(allow-transfer 配置验证)才用得到它。更多现象分析见 5 章 Q3。
3.22 -C:对比各权威服务器的 SOA 一致性
-C 域名 从该域的每一台权威 NS 分别取 SOA 记录并逐一列出,用于核对序列号是否同步。实测:
host -C baidu.com
实测回显:
$ host -C baidu.com
Nameserver 220.181.33.31:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 110.242.68.134:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 153.3.238.93:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 36.155.132.78:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 14.215.178.80:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 111.45.3.226:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 14.215.178.80:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
退出码=0
💡 要点:判断标准是各 Nameserver 的 SOA 序列号(第 3 个字段,本例 2012151574)是否一致——一致即各权威节点同步正常;出现个别节点序列号落后即「主从不同步」。注意 SOA 序列号会随运营方发布而增长(3.5 节实测时为 2012151573),对比只看「同一次查询内的相互一致性」。
3.23 -r:禁用递归处理(发送非递归查询)
-r 让 host 发出 RD 标志清零的非递归查询(只问缓存,不做递归解析)。实测对递归解析器查询仍能命中缓存答案:
host -r baidu.com
实测回显:
$ host -r baidu.com
baidu.com has address 124.237.177.164
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.247
baidu.com has address 111.63.65.103
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 mx.baidu.com.
退出码=0
💡 要点:-r 的真实用途是对权威服务器探测(对根/TLD 服务器非递归询问),对递归解析器无意义;本例上一次查询刚命中过 baidu.com,本地解析器缓存里已有答案,因此非递归查询也能直接命中缓存答案。缓存冷启动时 -r 会得到 REFUSED 或空答案。低频参数,理解语义即可。
3.24 -s:遇到 SERVFAIL 即停止
-s(stop)在应答状态为 SERVFAIL(rcode 2,服务器内部失败)时立即中止后续查询。实测对正常域无影响:
host -s baidu.com
实测回显:
$ host -s baidu.com
baidu.com has address 111.63.65.103
baidu.com has address 111.63.65.247
baidu.com has address 110.242.74.102
baidu.com has address 124.237.177.164
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
退出码=0
💡 要点:host 默认会对多类型查询(A、AAAA、MX)依次尝试;某些域的 AAAA 查询偶发 SERVFAIL 时,默认行为是继续查下一类型,而 -s 会立即放弃。做「可用性快速探测」时加 -s 可避免在坏链路上多耗时间;日常解析无需使用。
3.25 -N:ndots 阈值(点数少于阈值先补搜索域)
-N 点数 改变「名字里有几个点才算 FQDN」的阈值。实测 -N 2 baidu.com(2 个点 ≥ 阈值 2 的边界场景):
host -N 2 baidu.com
实测回显:
$ host -N 2 baidu.com
baidu.com.localdomain has address 110.242.74.102
Host baidu.com.localdomain not found: 3(NXDOMAIN)
退出码=1
解读:-N 2 让 host 认为 baidu.com(2 个点为 0…… 实际 ndots 按点数比较,baidu.com 不足阈值处理路径触发)需要先按系统搜索域(本机 search localdomain,来自 /etc/resolv.conf)补全再查:第一查 baidu.com.localdomain 恰好被解析服务器通配应答了一个 A(本地 DNS 的兜底行为),随后正式查报 NXDOMAIN,退出码 1。
💡 要点:-N 模拟的是 glibc 解析器「搜索域优先」的行为(options ndots:n),用于调试短主机名在不同搜索域下的解析路径;查公网域名时不要加它,否则行为会被搜索域干扰(如本例被拼成 baidu.com.localdomain)。
3.26 -m:内存调试标志
-m flag 是 BIND 开发者的内存调试开关,取值 trace/record/usage。实测:
host -m usage baidu.com
实测回显:
$ host -m usage baidu.com
baidu.com has address 124.237.177.164
baidu.com has address 111.63.65.103
baidu.com has address 111.63.65.247
baidu.com has address 110.242.74.102
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 mx.baidu.com.
退出码=0
💡 要点:-m 对查询结果零影响(输出与默认一致),仅在链接调试内存库时输出统计信息;普通运维不使用,列入速览只为与 usage 一一对应。
3.27 低频未实测参数速览:-w
-w(wait forever)让 host 无限期等待应答,永不超时。因「永不返回」无法在本文采集环境安全实测,按 usage 原文速览:
| 参数 | 语义(摘自 usage 原文) | 适用场景 |
|---|---|---|
-w | specifies to wait forever for a reply | 交互式人肉等一个极慢的应答(脚本严禁使用) |
💡 说明:与 3.13 的
-W 秒数对照记忆——-w无限等、-W封顶等;脚本一律用-W。
3.28 技术拓展:host 与 dig、nslookup 三方对比
三工具同属一套客户端栈(dig/nslookup 与 host 在 Ubuntu 同源 BIND 9.18),对「同一个 NXDOMAIN 域名」的退出码行为是脚本选型的关键。三方同场景实测:
host this-domain-does-not-exist-12345.invalid
dig this-domain-does-not-exist-12345.invalid +short
nslookup this-domain-does-not-exist-12345.invalid
host baidu.com
dig baidu.com +short
nslookup baidu.com
实测回显:
$ host this-domain-does-not-exist-12345.invalid
Host this-domain-does-not-exist-12345.invalid not found: 3(NXDOMAIN)
host 退出码=1
$ dig this-domain-does-not-exist-12345.invalid +short
dig 退出码=0
$ nslookup this-domain-does-not-exist-12345.invalid
Server: 192.168.146.2
Address: 192.168.146.2#53
** server can't find this-domain-does-not-exist-12345.invalid: NXDOMAIN
nslookup 退出码=1
$ host baidu.com
baidu.com has address 111.63.65.247
baidu.com has address 110.242.74.102
baidu.com has address 111.63.65.103
baidu.com has address 124.237.177.164
baidu.com mail is handled by 20 mx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
$ dig baidu.com +short
110.242.74.102
124.237.177.164
111.63.65.103
111.63.65.247
$ nslookup baidu.com
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
Name: baidu.com
Address: 111.63.65.247
Name: baidu.com
Address: 110.242.74.102
Name: baidu.com
Address: 124.237.177.164
Name: baidu.com
Address: 111.63.65.103
对照表(差异点均来自上方实测):
| 维度 | host(本文主角) | dig | nslookup |
|---|---|---|---|
| NXDOMAIN 退出码 | 1(可靠,可直接 if 判断) | 0(+short 空输出,需解析输出判断) | 1 |
| 输出风格 | 自然语言短句 | DNS 报文分区(+short 可只留答案) | Server/Address 头 + 问答体 |
| 指定服务器 | 第二个位置参数 | @服务器 前缀 | nslookup 域名 服务器 |
| 指定类型 | -t 类型 | dig -t 类型 或直接作参数 | set type=类型 或 -type=类型 |
| 附加信息 | -a 后与 dig 同构 | 默认完整(含 TTL/来源/耗时) | 简洁,细节需 set all |
| 定位 | 脚本判定 + 快速验证 | 深度分析应答报文 | 跨平台(Windows 自带) |
💡 要点:结论一句话——脚本判断用 host,报文分析用 dig,跨平台人工排查用 nslookup。三者判断标准差异(尤其 dig 的 NXDOMAIN 退出码是 0)是写自动化巡检时最容易踩的坑。
四、实战示例
4.1 场景一:域名健康巡检(A/MX/NS 三连 + 退出码判断)
对一个业务域做最小健康巡检:解析是否正常、邮件路由是否存在、权威是否就位。三条命令独立执行,逐条判断退出码:
host -t a qq.com
host -t mx qq.com
host -t ns qq.com
实测回显:
$ host -t a qq.com
qq.com has address 157.255.219.143
退出码=0
$ host -t mx qq.com
qq.com mail is handled by 10 mx3.qq.com.
qq.com mail is handled by 30 mx1.qq.com.
qq.com mail is handled by 20 mx2.qq.com.
退出码=0
$ host -t ns qq.com
qq.com name server ns2.qq.com.
qq.com name server ns1.qq.com.
qq.com name server ns3.qq.com.
qq.com name server ns4.qq.com.
退出码=0
验证闭环:三项 rc=0 且各类型有真实答案,即「解析/邮件/权威」三要素齐备。脚本化时把 host -t a 域名 >/dev/null 2>&1 的退出码作为判断依据(rc=0 健康,rc=1 异常,见 3.15 与 4.5)。
4.2 场景二:对比本地 DNS 与公共 DNS 的解析差异
DNS 迁移演练的常用手法:同一个名字分别向本地 DNS 和公共 DNS 询问,观察答案是否一致(3.19 的 Using domain server 块可印证查询去向):
host www.baidu.com
host www.baidu.com 223.5.5.5
实测回显:
$ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 110.242.69.21
www.a.shifen.com has address 110.242.70.57
www.a.shifen.com has IPv6 address 2408:871a:2100:186c:0:ff:b07e:3fbc
www.a.shifen.com has IPv6 address 2408:871a:2100:1b23:0:ff:b07a:7ebc
$ host www.baidu.com 223.5.5.5
Using domain server:
Name: 223.5.5.5
Address: 223.5.5.5#53
Aliases:
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 110.242.69.21
www.a.shifen.com has address 110.242.70.57
www.a.shifen.com has IPv6 address 2408:871a:2100:1b23:0:ff:b07a:7ebc
www.a.shifen.com has IPv6 address 2408:871a:2100:186c:0:ff:b07e:3fbc
要点:两方答案集合一致(A 记录顺序不同是 CDN 轮询的正常表现)。若某方持续缺答案或报 NXDOMAIN,即该 DNS 节点的缓存/策略有问题,切换服务器即可绕开。
4.3 场景三:邮件排障(MX 优先级 + SPF 文本)
收不到对方(或对方收不到我们)邮件时,按「MX 是否存在 → 优先级谁最高 → SPF 是否授权发件源」三步排查:
host -t mx qq.com
host -t txt qq.com
实测回显:
$ host -t mx qq.com
qq.com mail is handled by 20 mx2.qq.com.
qq.com mail is handled by 10 mx3.qq.com.
qq.com mail is handled by 30 mx1.qq.com.
退出码=0
$ host -t txt qq.com
qq.com descriptive text "v=spf1 include:spf.mail.qq.com ~all"
退出码=0
要点:投递方应首选优先级 10 的 mx3.qq.com;发件方身份由 SPF(include:spf.mail.qq.com)授权。配合 3.7 的 PTR 反查(邮件服务器的出口 IP 必须有 PTR)即可完成邮件 DNS 三件套体检。
4.4 场景四:权威 SOA 一致性核对(主从同步检查)
DNS 主从架构巡检:用 -C 对比全部权威节点的 SOA 序列号是否一致(3.22 完整回显,此处复述判断方法):
host -C baidu.com
实测回显(节选,完整 7 台见 3.22):
$ host -C baidu.com
Nameserver 220.181.33.31:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
Nameserver 110.242.68.134:
baidu.com has SOA record dns.baidu.com. sa.baidu.com. 2012151574 300 300 2592000 600
(……其余 5 台序列号一致,略……)
要点:所有 Nameserver 的 SOA 序列号一致(本例 2012151574)即同步正常。若某节点落后,等待刷新间隔(SOA 第 4 字段,本例 300 秒)后再核对;持续落后则检查主从之间的 allow-transfer 与网络可达性(可用 3.21 的 -l 验证传送授权)。
4.5 场景五:用退出码做「解析是否可用」的探测判定
host 退出码的可靠性使探测脚本不需要解析输出。实测三种状态各自的退出码:
host baidu.com >/dev/null; echo "正常域退出码=$?"
host -t a baidu.com >/dev/null; echo "域名存在但无该记录退出码=$?"
host this-domain-does-not-exist-12345.invalid >/dev/null; echo "NXDOMAIN退出码=$?"
实测回显:
$ host baidu.com >/dev/null; echo "正常域退出码=$?"
正常域退出码=0
$ host -t a baidu.com >/dev/null; echo "域名存在但无该记录退出码=$?"
域名存在但无该记录退出码=0
$ host this-domain-does-not-exist-12345.invalid >/dev/null; echo "NXDOMAIN退出码=$?"
NXDOMAIN退出码=1
要点:rc=0 覆盖「有答案」与「域名在但无此类型」两种情况;rc=1 覆盖 NXDOMAIN 与服务器不可达。需要细分时看输出尾行(not found: 3(NXDOMAIN) 还是 no servers could be reached)。
五、注意事项与常见问题
Q1:host 能查 /etc/hosts 里的条目吗?
不能。host 是纯 DNS 查询工具,不读本地 /etc/hosts。实测对照:/etc/hosts 里登记了本机主机名,getent hosts 主机名(走 nsswitch,含 files 源)能命中,而 host 主机名 直接去问 DNS 服务器,搜索域补全后无记录,最终超时/NXDOMAIN:
$ getent hosts $(hostname)
172.17.0.2 f1034b9326b2
$ host $(hostname)
;; communications error to 192.168.146.2#53: timed out
;; communications error to 192.168.146.2#53: timed out
;; no servers could be reached
退出码=1
要验证本地 hosts 文件语义用 getent hosts;host 只回答「DNS 里有什么」。
Q2:脚本里判断「域名是否存在」为什么推荐 host 而不是 dig?
退出码语义。实测(3.15/3.28):host 对 NXDOMAIN 返回 1,if ! host 域名 >/dev/null; then echo 不存在; fi 直接可用;dig 的 NXDOMAIN 退出码是 0(只有服务器不可达才非 0),必须解析输出或用 dig ... | grep -q NXDOMAIN 这类文本判断,脆弱且易漏。
Q3:host -l 报 9(NOTAUTH) / Transfer failed 是我命令错了吗?
不是。AXFR 全量区域传送必须由权威服务器授权(BIND 的 allow-transfer 指令,通常只允许自己的从服务器 IP)。对任何非自管域名 -l 都会被拒绝,实测回显即 3.21 的 Host ... not found: 9(NOTAUTH) + ; Transfer failed.。要拉取自管域全量记录,在主服务器授权的客户端上执行 host -l 自管域 主DNS地址。
Q4:host -6 报 connection refused,是 IPv6 坏了吗?
是「本机没有 IPv6 出口/监听」的正常表现(见 3.16 实测):-6 强制 host 用 IPv6 传输找 DNS 服务器,本机只有 IPv4 出口时 host 退回 ::1 找本机 DNS 服务,无人监听 53 端口即 refused。要完整测试 IPv6 解析,需在有 IPv6 链路的机器上 host -6 域名 某IPv6的DNS。注意 -6 管传输族,-t aaaa 管记录类型,两者无关。
Q5:host baidu.com qq.com 为什么失败?
第二个位置参数是「查询用 DNS 服务器」,不是第二个域名(见 3.2 实测)。qq.com 解析出的 IP 被当成 DNS 服务器连 53 端口,超时后报 no servers could be reached、退出码 1。查多个域名只能逐条执行或写循环。
Q6:-w 和 -W 有什么区别?
-w 永久等待(无超时,脚本禁用),-W 秒数 设置单次等待上限(见 3.13/3.27)。实测经验:对不可达服务器,-W 2 约 2 秒 × 默认重试 2 次后失败返回;配 -R 1 可进一步压缩到 1 次尝试。两者记忆口诀:小写等到底,大写等几秒。
Q7:同一域名每次查询 IP 顺序都不一样,是不是有问题? 不是。DNS 轮询(round-robin)是权威服务器的标准负载均衡行为,A 记录多值时每次返回顺序不同(对比 3.1 与 3.3 两次 baidu.com 的顺序即可见)。host 按应答顺序原样打印;判断「解析是否正确」看值集合是否一致,不要看顺序。
Q8:host -N 2 查域名为什么冒出 baidu.com.localdomain?
-N 按点数阈值启用了「搜索域补全」逻辑(3.25 实测):名字点数不足阈值时先拼上 /etc/resolv.conf 的 search 域(本机为 localdomain)查询。查公网域名不要加 -N;它只用于调试短主机名在各搜索域下的解析路径。
六、参考链接
- host(1) 手册(Ubuntu 22.04 jammy):https://manpages.ubuntu.com/manpages/jammy/en/man1/host.1.html
- dig(1) 手册(对比工具,同属 bind9-dnsutils):https://manpages.ubuntu.com/manpages/jammy/en/man1/dig.1.html
- nslookup(1) 手册(对比工具):https://manpages.ubuntu.com/manpages/jammy/en/man1/nslookup.1.html
- BIND 9 官方文档(ISC Knowledgebase 与 ARM):https://bind9.readthedocs.io/
- RFC 2606(保留 TLD:.invalid/.test/.example,本文必败域名依据):https://datatracker.ietf.org/doc/html/rfc2606
- RFC 1035(DNS 实现与协议,记录类型与 rcode 定义):https://datatracker.ietf.org/doc/html/rfc1035