Простой скрипт Bash для проверки хостов

Вы можете сдвигать позиционные параметры POSIX с помощью командыshift [n](спасибо @ilkkachu )где n— количество параметров для сдвига (по умолчанию 1 ). Чтобы сбросить все параметры, вы можете сдвинуть все параметры с помощью

.

shift $#

перед тем, как вы получите свой сценарий.

POSIX-способ изменения (установки или отмены )позиционных параметров заключается в использовании команды set. Чтобы сбросить все позиционные параметры, вы можете использовать

set --

перед тем, как вы получите сценарий.

1
19.11.2020, 00:17
4 ответа

Обдумать что-нибудь с nmap?

nmap -sP 10.1.2.0/24 10.2.5.0/24

Это может быть даже проще, чем цикл ping -, и он может сканировать несколько хостов параллельно, поэтому он будет отображаться намного быстрее; но для этого потребуется установка nmap и его обычных зависимостей, а это может расстроить резидентного оберлейтенанта службы безопасности, зацикленного на наихудшем -случае.

обновление :хорошо, оберлейтенант точно.

Вместо:

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

время тоже хорошее, так как большая часть времени ждет, пока пинги не прекратятся. Положительные результаты возвращаются очень быстро:

$ 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

Замените арпинг и его конкретные параметры на пинг, если вы хотите понюхать и винбоксы, так как они ненавидят пинги.

Замените дрянной grep на awk '/bytes from/{print $4}', если хотите поинтересоваться.

Не скрою, идеи других парней выглядят как отличные ответы на вопросы викторины, а мои выглядят как забивание гвоздей отверткой, но это быстро и просто.

2
18.03.2021, 22:48

Насколько велик ваш диапазон 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— правильный инструмент.

0
18.03.2021, 22:48

Что-то подобное должно помочь, добавьте столько IP, сколько хотите, в список ips:

#!/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
0
18.03.2021, 22:48

Вот вы здесь.

Вы можете использовать так:

./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
0
18.03.2021, 22:48

Теги

Похожие вопросы