0

这个需要一些额外的眼睛......

dns_lookup() {
    ip_set
    if [ `ip_ping ${ip_address}` -eq 0 ]
    then
            host=""
            dig +short -x ${ip_address} | sed 's/\.$//g' | while read host
            do
                    if [ -z "${host}" ]
                    then
                            host="unknown"
                    fi
                    echo "${ip_address},${host}"
            done
    fi

}

如果 ip 可 ping 并且具有 dns 名称,我会得到想要的结果。如果 ip 可 ping 但没有 dns 名称,我不会得到结果。


ip_set() {
        ip_address="${a}.${b}.${c}.${d}"
}

ip_ping() {
  timeout ${delay} ping -q -c 1 -i 1 -W 1 -w 4 $1 > /dev/null 2>&1 ; echo $?
}

4

2 回答 2

0

当没有主机名时,您不会得到结果,因为while read当没有要读取的行时,您的循环永远不会运行。你应该让你的打印代码运行,不管:

host=$(dig +short -x "${ip_address}" | sed 's/\.$//g')
if [ -z "${host}" ]
then
    host="unknown"
fi
printf "${ip_address},%s\n" $host

另外,你的情况是错误的。您不应回显退出状态并将其作为文本进行比较。您应该让命令的退出状态成为函数的退出状态:

ip_ping() {
  timeout ${delay} ping -q -c 1 -i 1 -W 1 -w 4 $1 > /dev/null 2>&1 
  # functions implicitly 'return $?' if you don't specify anything else
}

现在您可以轻松检查您的功能:

if ip_ping "$ip_address"
then
    echo "It worked"
else
    echo "It failed.."
fi
于 2013-08-07T16:37:48.697 回答
0

也许这就是你需要的。告诉我你是否需要修改。

dns_lookup() {
    ip_set
    if [ `ip_ping ${ip_address}` -eq 0 ]
    then
        host=""
        dig +short -x ${ip_address} | sed 's/\.$//g' | {
            hashosts=false
            while read host
            do
                if [ -n "${host}" ]
                then
                    hashosts=true
                    echo "${ip_address},${host}"
                fi
            done
            [ "${hashosts}" = false ] && echo "${ip_address},unknown"
        }
    fi
}

我也会建议更改功能 ip_ping 但 that_other_guy 已经这样做了。

于 2013-08-07T16:45:16.830 回答