我的 中有几个名称服务器条目/etc/resolv.conf
,一些是公开的,一些是我自己的:
search subdomain.example.com
nameserver 8.8.8.8
nameserver 10.20.30.1
nameserver 10.20.30.2
我想要 cURL 从只有我自己的 DNS 服务器可以解析的地址加载文件:
curl subdomain.example.com/myfile
它失败了
curl:(6)无法解析主机:subdomain.example.com
在我看来,cURL 会尝试第一个名称服务器,如果失败则停止尝试。但我无法确认,因为curl -v
它没有打印它使用的 DNS 服务器。
因此另一个问题是,如何确定 cURL 默认使用哪个 DNS 服务器,以及理想情况下如何让它使用 resolv.conf 中的其他条目重试。我知道--dns-servers
命令行选项。如果可能的话,我更愿意使用 DHCP 提供的 DNS 设置。
“是否重试”取决于失败的原因。如果服务器没有响应,Curl 将重试;如果服务器响应“未知”,则不会重试。
实际上,没有软件会在收到第一台服务器的有效响应后重试不同的服务器,即使它收到“域未知”响应 - 这仍然是一个有效响应。列出多台服务器的功能仅适用于第一台服务器根本没有响应的情况 - 不适用于不同服务器知道不同数据的情况。
如果您有内部 DNS 域,则需要单独的解析器来将两组服务器统一到单个视图中。通常内部 DNS 服务器已经自行完成此操作,但如果您出于某种原因不想将常规 Internet DNS 查询发送到 10.20.30.1,则必须在其基础上运行另一个本地 DNS 服务器。
例如,localhost 上的 Dnsmasq 是一种常见的做法;它既提供本地 DNS 缓存,又能将不同的查询路由到不同的上游服务器。Unbound 和 systemd-resolved 也是可行的。
我找到了https://serverfault.com/questions/398837/second-nameserver-in-etc-resolv-conf-not-picked-up-by-wget。请随意移动或将我的问题标记为重复。@grawity 感谢您的回答,我选择了,但
export RES_OPTIONS="rotate"
我在 中找到man resolv.conf
(不是 DHCP 提供的 DNS 设置,但解决了我的问题)