Ip host script bash

家住魔仙堡 提交于 2021-01-28 04:40:34

问题


In the first if we want the hostname to appear, which is the 5th field from a file. Then if the IP we give to the host command does not exist, then the command returns message 3 (NXDOMAIN). The script should recognize if the command was "not found". In this case it will must simply print (-).

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

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

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

Do u have any solution on this exercise?


回答1:


You're not testing the result of the host command, you're testing the value of the original $ip variable.

Save the output to a variable, test that variable, then either print the output or - depending on the test.

You don't need to do a regexp match, just match the exact string.

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

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



回答2:


The answer is much simpler than you think, you don't need to do any matching. You can just use the return code from host

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

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

Proof of Concept

$ 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
-



回答3:


#!/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



回答4:


if you want to cover also ipv6 then I think this will cover it

#!/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

Note: For some versions of bash the -4 and -6 options do not work.

Thanks to Léa Gris for pointing out the locales problem.

Inspired from https://helloacm.com/how-to-valid-ipv6-addresses-using-bash-and-regex/



来源:https://stackoverflow.com/questions/62182898/ip-host-script-bash

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!