# Сканируем сети с помощью скриптов Bash

### Сканируем подсети <a href="#skaniruem-podseti" id="skaniruem-podseti"></a>

Здесь bash-скрипт просканирует сеть на предмет хостов, подключенных по IP-адресам 10.1.1.1 – 255.

Скрипт выведет сообщение Хост с IP → IP-адрес поднят, если команда ping была успешной.

На всякий случай: мы можем менять скрипт для сканирования диапазона хостов. Вот сам скрипт:

```
#!/bin/bash

is_alive_ping()
{
  ping -c 1 $1 > /dev/null
  [ $? -eq 0 ] && echo Хост с IP: $i поднят.
}

for i in 10.1.1.{1..255} 
do
is_alive_ping $i & disown
done
```

Выполнение скрипта:

```
./bash_ping_scan.sh
```

### Настраиваем уведомление по почте, когда сервер не работает  <a href="#nastraivaem-uvedomlenie-po-pochte-kogda-server-ne-rabotaet" id="nastraivaem-uvedomlenie-po-pochte-kogda-server-ne-rabotaet"></a>

Системный администратор может регулярно выполнять этот скрипт с использованием планировщика cron. Как это работает:

1. Скрипт использует команду ping для проверки связи с хостом или IP-адресом, указанным в качестве аргумента.
2. В случае, если место назначения недоступно → в ход вступает команда mail для уведомления системного администратора об этом событии.

Сам скрипт:

```
#!/bin/bash

for i in $@
do
ping -c 1 $i &> /dev/null

if [ $? -ne 0 ]; then
 echo "`date`: ping не прошел, $i хост лежит !" | mail -s "$i хост лежит!" admin@itsecforu.ru
fi
done
```

Выполнение скрипта:

```
./check_hosts.sh google.com yahoo.com 192.168.1.2 mylinuxbox N2100
```

### Создаем логи мониторинга <a href="#sozdaem-logi-monitoringa" id="sozdaem-logi-monitoringa"></a>

Это улучшенная версия предыдущего примера. Подходит для сценария, когда в системе не настроена почта. Скрипт здесь сам создаст файл логов.

Ядро скрипта заключено в бесконечный цикл while, который настроен на выполнение проверки ping каждый час. Если собираетесь использовать скрипт с планировщиком cron → удалите бесконечный цикл while.

Сам скрипт:

```
#!/bin/bash 
 
LOG=/tmp/mylog.log 
SECONDS=3600 

EMAIL=admin@itsecforu.ru
 
for i in $@; do 
 echo "$i-UP!" > $LOG.$i 

done 
 
while true; do 
 for i in $@; do 

ping -c 1 $i > /dev/null 
if [ $? -ne 0 ]; then 
 STATUS=$(cat $LOG.$i) 
   if [ $STATUS != "$i-DOWN!" ]; then 
    echo "`date`: ping неудачен, $i хост лежит!" | 
   mail -s "$i хост лежит!" $EMAIL 

   fi 
 echo "$i-DOWN!" > $LOG.$i 

else 
 STATUS=$(cat $LOG.$i)
   if [ $STATUS != "$i-UP!" ]; then 
    echo "`date`: пинг прошел, $i Хост подня!" | 
   mail -s "$i Хост поднят !" $EMAIL

   fi 
 echo "$i-UP!" > $LOG.$i 
fi 
done 

sleep $SECONDS 
done
```

Выполнение скрипта:

```
./check-server-status.sh google.com yahoo.com 192.168.1.2 mylinuxbox N2100
```
