Вы можете сдвигать позиционные параметры POSIX с помощью командыshift [n]
(спасибо @ilkkachu )где n
— количество параметров для сдвига (по умолчанию 1 ). Чтобы сбросить все параметры, вы можете сдвинуть все параметры с помощью
.
shift $#
перед тем, как вы получите свой сценарий.
POSIX-способ изменения (установки или отмены )позиционных параметров заключается в использовании команды set
. Чтобы сбросить все позиционные параметры, вы можете использовать
set --
перед тем, как вы получите сценарий.
Обдумать что-нибудь с 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}', если хотите поинтересоваться.
Не скрою, идеи других парней выглядят как отличные ответы на вопросы викторины, а мои выглядят как забивание гвоздей отверткой, но это быстро и просто.
Насколько велик ваш диапазон 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
— правильный инструмент.
Что-то подобное должно помочь, добавьте столько 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
Вот вы здесь.
Вы можете использовать так:
./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