Проверить доступность хостов по заданному фильтру и вернуть статус: доступен или недоступен.

Вопрос или проблема

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

10.10.10.10 XX-YY_ZZ имя хоста в формате URL

Файл не CSV, а txt.

Я планирую сделать что-то простое, при запуске чего, например, pingme YY (где YY является общим элементом устройств, принадлежащих определенному местоположению), выводился бы результат, например:

XX-YY_ZZ = ALIVE

Наверное, это очень просто, но я понятия не имею, с чего начать, так как мы работаем на Linux REDHAT.

Любые подсказки и идеи будут ценны.

Я считаю, это сделает то, что вам нужно:

pingme () {
hostfile="/home/jbutryn/test/hostfile.txt"
IFS= mapfile -t  hosts < <(cat $hostfile)
for host in "${hosts[@]}"; do
    match=$(echo "$host" | grep -o "\-$1_" | sed 's/-//' | sed 's/_//')
    if [[ "$match" = "$1" ]]; then
        hostname=$(echo "$host" | awk '{print $2}')
        ping -c1 -W1 $(echo "$host" | awk '{print $1}') > /dev/null
        if [[ $? = 0 ]]; then
            echo "$hostname is alive"
        elif [[ $? = 1 ]]; then
            echo "$hostname is dead"
        fi
    fi
done
}

Вы можете запустить эту функцию, например: pingme UR01 и она должна выдать что-то вроде:

[root@JBCLAMP001 test]# pingme CC
BB-CC_DD is dead
AA-CC_EE is alive
[root@JBCLAMP001 test]# pingme DD
CC-DD_EE is dead
CC-DD_JJ is alive

Вы можете использовать код выхода ping, чтобы определить, прошел ли пинг успешно или нет.

ping HOST -c1 > /dev/null && echo "ALIVE" || echo "DEAD"

Если хост активен, код выхода равен 0, а если нет — 1. Чтобы пинговать каждый хост, вы можете перебрать каждую строку и использовать awk, чтобы получить первый столбец, который содержит адрес/имя хоста.

exec 3<input.txt

while read -u3 line
do
    if [ "$line" == "" ]; then
        # пропустить пустые строки
        continue
    fi

    ping -c1 $(echo "$line"| awk '{print $1}') > /dev/null

    if [ $? = 0 ]; then
        echo "$line=ALIVE"
    else
        echo "$line=DEAD"
    fi
done

ИЗМЕНЕНИЕ:

Если вам нужно только пинговать хост, сопоставив одну строку в файле, вы можете использовать grep:

# найти строку для $host, только 1 строка
line = grep "$HOST" input.txt |tail -n 1

# $($line |awk '{print $1}') выводит первый столбец строки (адрес)
ping -c1 $($line |awk '{print $1}') >/dev/null && echo "$line=ALIVE" || echo "$line=DEAD"

Ответ или решение

Создание скрипта для проверки доступности множества хостов по фильтру из текстового файла — задача, которая требует понимания работы с сетевыми командами и обработки текста в Linux. В данном ответе я подробно объясню, как можно реализовать данную задачу на примере системы Red Hat Linux.

Теория

Для начала разберем, как можно использовать инструменты, доступные в Linux, такие как ping, grep, awk, и встроенную команду bash для обработки текстовых файлов. ping используется для проверки сетевой доступности хоста. Эта команда отправляет ICMP-запросы к целевому IP-адресу и ожидает ответа.

Командная строка в Linux позволяет использовать логические структуры и фильтрацию. Например, команда grep для поиска строк, которые совпадают с определенным шаблоном. awk — это мощный инструмент для обработки текстовых данных, который помогает выделить нужные фрагменты из строк.

Пример

Посмотрим на предложенный скрипт pingme, который рассчитан на то, чтобы принимать на вход идентификатор группы устройств и проверять их доступность.

pingme () {
    hostfile="/home/jbutryn/test/hostfile.txt"
    IFS= mapfile -t hosts < <(cat $hostfile)
    for host in "${hosts[@]}"; do
        match=$(echo "$host" | grep -o "\-$1_" | sed 's/-//' | sed 's/_//')
        if [[ "$match" = "$1" ]]; then
            hostname=$(echo "$host" | awk '{print $2}')
            ping -c1 -W1 $(echo "$host" | awk '{print $1}') > /dev/null
            if [[ $? -eq 0 ]]; then
                echo "$hostname is alive"
            else
                echo "$hostname is dead"
            fi
        fi
    done
}

Этот скрипт выполняет чтение из файла, содержащего IP-адреса и идентификаторы хостов, и фильтрует те строки, которые соответствуют переданному шаблону. Затем он использует команду ping для каждого найденного IP-адреса. В случае успешного ответа от ping, скрипт выводит сообщение alive, в противном случае — dead.

Применение

Вот пошаговая инструкция по созданию и использованию скрипта:

  1. Создайте текстовый файл с хостами: В файле должны находиться IP-адреса или имена хостов вместе с описанием. Каждая строка — это отдельный хост. Пример строки: 10.10.10.10 XX-YY_ZZ.

  2. Напишите скрипт: Используйте предложенный выше скрипт в функции pingme. Поместите функцию в файл с расширением .sh.

  3. Обеспечьте исполнение: Сделайте скрипт исполняемым. В командной строке выполните chmod +x ваш_скрипт.sh.

  4. Запустите скрипт: Вызовите функцию через терминал, например, ./ваш_скрипт.sh YY, где YY — это часть имени, по которой вы фильтруете хосты.

  5. Результат: Получите на экране список хостов с отметкой alive или dead, что покажет текущее состояние их доступности.

Полезные советы

  • Обработка пустых строк: Добавьте проверку на пустые строки, чтобы избегать ошибок в обработке. Вложите обработку в условие, которое пропускает пустые строки.

  • Расширяемость: Скрипт можно модифицировать для использования более сложных шаблонов для фильтрации или для вывода более детальной информации о каждом хосте.

  • Журналирование: Добавьте функционал журналирования, чтобы записывать результаты проверки. Это позволит отслеживать изменения доступности хостов во времени.

Заключение

Скрипт pingme, как описано выше, предоставляет простой способ управлять и проверять доступность множества сетевых устройств в вашей инфраструктуре. Используя базовые инструменты Linux, вы можете легко адаптировать его для ваших нужд, добавляя, например, дополнительные параметры проверки или поддержку других файловых форматов. Это решение также может служить основой для дальнейшего усложнения и интеграции с другими автоматизированными системами мониторинга.

Adaptируя и расширяя этот базовый пример, вы сможете более эффективно управлять своей сетью, минимизируя ручные проверки и предотвращая возможные сетевые сбои.

Оцените материал
Добавить комментарий

Капча загружается...