用于检查主机的简单 Bash 脚本

用于检查主机的简单 Bash 脚本

我目前正在尝试在 bash 中创建一个工具来检查活动系统。我不需要它成为某种疯狂复杂的工具。我只需要它告诉我我的机器已启动并正在运行。我知道我的剧本是嘉宝……这就是我来这里的原因。

#!/bin/bash

here()
{
ping -c 1 $1 > dev/null
echo "Good morning, Here are the machines that are up and running: $i"
}

for i in insert ip range
do here $i
done

答案1

考虑一下 nmap 的一些东西吗?

nmap -sP 10.1.2.0/24 10.2.5.0/24

它可能比 ping 循环更简单,并且它可以并行扫描多个主机,因此速度会更快;但它需要安装 nmap 及其通常的依赖项,这可能会让专注于最坏情况的驻地安全中尉感到不安。

更新:好的,当然是 Oberleutnanten。

反而:

xargs parallel -j20 ping -c1 -- | grep 'bytes from'

喜欢

echo 10.0.{1..2}.{1..15} |\
  xargs parallel -j20 ping -c1 -- | grep 'bytes from'

64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.150 ms
64 bytes from 10.0.2.4: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.138 ms

时间也很好,因为大部分时间都在等待 ping 立即终止。积极的结果很快就会回来:

$ time (echo 10.0.{1..2}.{1..15} | xargs parallel -j30 ping -c1 -- | grep 'bytes from')
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.2.3: icmp_seq=1 ttl=64 time=0.150 ms
64 bytes from 10.0.2.4: icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.138 ms

real    0m10.030s
user    0m0.019s
sys     0m0.018s

如果你也想嗅探 winbox,请将 arping 及其特定参数替换为 ping,因为它们讨厌 ping。

如果你想变得更热衷的话,可以将俗气的 grep 换成 awk '/bytes from/{print $4}'。

毫无疑问,其他人的想法看起来像是很棒的测验提交,而我的想法看起来就像用螺丝刀敲钉子,但它又快又简单。

答案2

与此类似的内容应该会有所帮助,将任意数量的 IP 添加到 ip 列表中:

#!/bin/bash

ips=(192.168.0.1 8.8.8.8 127.0.0.1)

here() {
    ping -c 1 $1 > /dev/null

    if [[ $? -eq 0 ]]
    then
        echo "Good morning, Here are the machines that are up and running: $i"
    fi

}

for i in ${ips[@]}

do here $i

done

答案3

你的IP范围有多大?

对于 /24 考虑

for i in {1..254} ; do
    if ping -c1 10.11.12.$i >/dev/null 2>/dev/null ; do
        echo "10.11.12.$i is up"
    else
        echo "10.11.12.$i is down
    fi
done

对于 /16,您可以添加第二个循环:

for j in {1..254} ; do
    for i in {1..254} ; do
        if ping -c1 10.11.$j.$i >/dev/null 2>/dev/null ; do
            echo "10.11.$j.$i is up"
        else
            echo "10.11.$j.$i is down
        fi
    done
done

然后喝几杯咖啡等待它完成。

但确实nmap是正确的工具。

答案4

给你。

你可以这样使用:

./your_script_name.sh 192.168.1.0/24

#!/bin/bash

SUBNET=$1

if [[ -z "$SUBNET" ]]; then
    echo "Usage: ./your_script_name.sh <SUBNET>"
    exit
fi

printsubnet() {
        local OLDIFS="$IFS"
        local SUB=${1/\/*/}
        local MASK=$(( 1 << ( 32 - ${1/*\//} )))

        IFS="."
                set -- $SUB
                IPS=$((0x$(printf "%02x%02x%02x%02x\n" $1 $2 $3 $4)))
        IFS="$OLDIFS"

        for ((N=0; N<MASK; N++))
        {
                VAL=$((IPS|N))

                printf "%d.%d.%d.%d\n"                  \
                        $(( (VAL >> 24) & 255 ))        \
                        $(( (VAL >> 16) & 255 ))        \
                        $(( (VAL >> 8 ) & 255 ))        \
                        $(( (VAL)       & 255 ))
        }
}

mapfile IPS < <(printsubnet $SUBNET)

for row in "${IPS[@]}";do
        ping -c 1 "$row" >/dev/null 2>/dev/null
        if [ $? -eq 0 ]; then
                echo "$row is up"
        else
                echo "$row is down"
        fi
done

相关内容