Dns 当从shell而不是bash脚本运行时,DIG一致地返回IP值

Dns 当从shell而不是bash脚本运行时,DIG一致地返回IP值,dns,ip,dig,Dns,Ip,Dig,我每15分钟运行一次这个脚本,记录我在duckdns.org上设置的四个动态主机的IP DUCKDNS=( "sub1.duckdns.org" "sub2.duckdns.org" "sub3.duckdns.org" "sub4.duckdns.org" ) function resolveIP () { CURRENT_IP=$(dig +short $1) echo $CURRENT_IP } for HOST in "

我每15分钟运行一次这个脚本,记录我在duckdns.org上设置的四个动态主机的IP

DUCKDNS=( "sub1.duckdns.org"
        "sub2.duckdns.org"
        "sub3.duckdns.org"
        "sub4.duckdns.org" )

function resolveIP () {
    CURRENT_IP=$(dig +short $1)
    echo $CURRENT_IP
}

for HOST in "${DUCKDNS[@]}"
do
    IP=$(resolveIP $HOST)
    echo -e "$HOST ... $IP"
done
当我从shell运行脚本时,每次都会收到一个IP值。当我通过cron运行脚本时,脚本偶尔返回空值

我相信这个问题与我在运行主机(不是dig)时注意到的一个2(SERVFAIL)错误有关。这是来自主机的响应:

host sub1.duckdns.org
sub1.duckdns.org has address 66.66.66.66 (NOTE: This value is correct)
Host sub1.duckdns.org not found: 2(SERVFAIL)
sub1.duckdns.org mail is handled by 50 sub1.duckdns.org.
虽然返回了一个错误,但IP地址是正确的,脚本将返回它。令人不安的是,有时情况并不一致。脚本每次从shell运行时都会提取值,大多数情况下都是通过cron运行时提取值

在用DuckDNS.org设置我的子域之后,我读到这可能不是一个明智的选择。也许这只是DuckDNS服务的问题?如果是,对其他动态DNS提供商有何建议


我觉得我就像活在一个bash版本的双缝实验中。有没有想过是什么导致了这种空IP行为?

我认为
dig
host
和运行环境之间的差异只是巧合。在所有这些情况下,您的DNS服务器似乎无法解析duckdns.org地址,返回SERVFAIL。这是一个包罗万象的错误,可以指示各种问题,通常是超时错误(例如,一个权威的duckdns.org服务器未能在您的DNS服务器的超时限制内响应)。这是相当普遍的。如果您想知道谁失败了,请定期运行
dig
+trace
并记录结果——这将为您提供迭代DNS查询并深入了解上述情况。啊哈!完美的非常感谢。我相信在我的研究中,我遇到了一些关于超时的挫折。有没有办法延长超时时间以给duckdns更多的时间?您可能可以在DNS服务器配置中更改超时时间,或者通过
+time
参数使用带有自定义超时的
dig
(说到这一点,它还具有
+trys
+retry
参数,这些参数可能会在超时时派上用场). 重要的是,当您使用自己的DNS服务器执行递归查询时,超时取决于DNS服务器和
dig
。如果DNS服务器先超时,则会出现SERVFAIL。当
dig
执行时,您将在超时时获得
dig
执行的任何操作。但是,迭代查询(
+trace
)只依赖于
dig
超时,因为它可以控制整个过程。谢谢!!这正是我前进所需要的!