ip主机脚本bash

时间:2020-06-03 21:19:11

标签: bash ip host

如果要显示主机名,则是第一个,这是文件中的第五个字段。然后,如果我们提供给主机的IP命令不存在,那么该命令将返回消息3(NXDOMAIN)。该脚本应识别该命令是否“未找到”。在这种情况下,它将 必须简单地打印(-)。

#!/bin/bash
ip="$1"

if [ "$ip" ] ; then
         host "$ip" | cut -d' ' -f5

 elif
         [[ "$ip" =~ "[3(NXDOMAIN)]$" ]] ; then
                echo "-"
fi

您对此练习有什么解决办法吗?

4 个答案:

答案 0 :(得分:2)

您不是在测试host命令的结果,而是在测试原始$ip变量的值。

将输出保存到变量,测试该变量,然后根据测试打印输出或-

您不需要进行正则表达式匹配,只需匹配确切的字符串即可。

#!/bin/bash
ip="$1"

if [ "$ip" ] ; then
    result=$(host "$ip" | cut -d" " -f5)
    if [[ $result = "3(NXDOMAIN)" ]] ; then
        echo "-"
    else
        echo "$result"
    fi
fi

答案 1 :(得分:2)

答案比您想象的要简单得多,您不需要进行 任何 匹配。您可以只使用host

中的返回码
#!/bin/bash
ip="$1"

if domain=$(host "$1"); then
  echo "${domain##* }"
else
  echo "-"
fi

概念证明

$ testHost(){ if domain=$(host "$1"); then echo "${domain##* }"; else echo "-"; fi }
$ testHost 172.217.6.46
sfo03s08-in-f14.1e100.net.
$ testHost 172.217.6.466
-

答案 2 :(得分:1)

#!/bin/bash

if  [ -n "$1" ] && [[ $1 =~ ^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$ ]] ;then

    res=$(host "$1" | cut -d' ' -f5)

    if [ "$res" != "3(NXDOMAIN)" ]; then
        echo "$res"
    else
        echo "-"
    fi

else
    echo "please enter a valid ip"
fi

答案 3 :(得分:0)

如果您还想涵盖ipv6,那么我认为这会涵盖

#!/bin/bash

# ipv4
if [[ $1 =~ ^([[:digit:]]{1,2}|1[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[0-5])\.([[:digit:]]{1,2}|1[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[0-5])\.([[:digit:]]{1,2}|1[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[0-5])\.([[:digit:]]{1,2}|1[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[0-5])$ ]]; then

    res=`host "$1" | cut -d' ' -f5`

    if [ "$res" != "3(NXDOMAIN)" ]; then
        echo "$res"
    else
        # valid ipv4 IP but not connected
        echo "-"
    fi

# ipv6
elif [[ $1 =~ ^(([[:xdigit:]]{1,4}:){7,7}[[:xdigit:]]{1,4}|([[:xdigit:]]{1,4}:){1,7}:|([[:xdigit:]]{1,4}:){1,6}:[[:xdigit:]]{1,4}|([[:xdigit:]]{1,4}:){1,5}(:[[:xdigit:]]{1,4}){1,2}|([[:xdigit:]]{1,4}:){1,4}(:[[:xdigit:]]{1,4}){1,3}|([[:xdigit:]]{1,4}:){1,3}(:[[:xdigit:]]{1,4}){1,4}|([[:xdigit:]]{1,4}:){1,2}(:[[:xdigit:]]{1,4}){1,5}|[[:xdigit:]]{1,4}:((:[[:xdigit:]]{1,4}){1,6})|:((:[[:xdigit:]]{1,4}){1,7}|:)|fe80:(:[[:xdigit:]]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[[:digit:]]){0,1}[[:digit:]])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[[:digit:]]){0,1}[[:digit:]])|([[:xdigit:]]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[[:digit:]]){0,1}[[:digit:]])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[[:digit:]]){0,1}[[:digit:]]))$ ]]; then

    res=`host "$1" | cut -d' ' -f5`

    if [ "$res" != "3(NXDOMAIN)" ]; then
        echo "1. $res"
    else
        # valid ipv6 IP but not connected
        echo "2. -"
    fi

else

    echo "Please enter a valid IP"
fi

注意:对于某些版本的bash,-4和-6选项不起作用。

感谢LéaGris指出了语言环境问题。

灵感来自https://helloacm.com/how-to-valid-ipv6-addresses-using-bash-and-regex/

相关问题