Как проверить несколько хостов на простую соединяемость?

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

Мне нужен инструмент, который скажет мне, открыто ли соединение с хостом или нет – нет данных для отправки или получения. Просто нужно узнать, успешно ли выполнено соединение.

Сегодня я использую telnet.

$ telnet myhost myport
Попытка подключения к 192.168.1.99...
Соединено с myhost.
Символ выхода - '^]'.
^[^]
telnet> quit
Соединение закрыто.

Но мне нужно вводить команды вручную. ^] и затем также quit.

Мне нужно проверить несколько хостов, и это слишком сложно.

Есть ли какой-нибудь инструмент, который решает эту задачу?

Если нет, мне придется написать 15 строк на perl – это нормально, но я бы предпочел существующий инструмент.

С помощью этих скриптов вы можете проверить, отвечает ли хост на заданном порту с:

встроенным /dev/tcp в bash.

Вы можете использовать IP-адреса или домены (имена хостов).

Скрипт 1
Одиночный порт

#!/bin/bash

HOST_NAME="127.1"
HOST_PORT="80"

if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
    echo -e "ПОРТ: ${HOST_PORT} | ВКЛ"
    else
    echo -e "ПОРТ: ${HOST_PORT} | ВЫКЛ"
fi

Скрипт 2
Диапазон портов

#!/bin/bash

HOST_NAME="127.1"

for HOST_PORT in {1..1000}
do

if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
    echo -e "ПОРТ: ${HOST_PORT} | ВКЛ"
    else
    echo -e "ПОРТ: ${HOST_PORT} | ВЫКЛ"
fi
done

Скрипт 3
Порты 1-65535

#!/bin/bash

HOST_NAME="127.1"
declare -A PORT_ON

for HOST_PORT in {1..65535}
do
    if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
        PORT_ON[${HOST_PORT}]="ВКЛ"
    fi
done

for i in ${!PORT_ON[*]}
do
    echo -e "$i : ${PORT_ON[$i]}"
done

Bash имеет встроенную перенаправление, которое может проверять открытые порты

host=192.168.1.99
if (echo > "/dev/tcp/${host}/22") >/dev/null 2>&1; then
  echo 'порт открыт'
else
  echo 'порт закрыт'
fi

или вы можете использовать nc(1):

host=192.168.1.99
if timeout 3 nc -z "$host" 22 2>/dev/null; then
  echo 'порт открыт'
else
  echo 'порт закрыт'
fi

Вы также можете использовать telnet программным образом, передавая его в что-то вроде grep:

host=192.168.1.99
if telnet "$host" 22 2>&1 | grep -q "Подключено"; then
  echo 'порт открыт'
else
  echo 'порт закрыт'
fi

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

Для проверки подключения к нескольким хостам с использованием разных инструментов существует множество методов, которые позволяют упростить задачу. Ваша потребность — узнать, открыт ли определённый порт на хосте, без необходимости отправки или получения данных, может быть реализована различными способами. В данном контексте мы рассмотрим несколько решений, включая встроенные возможности Bash, использования утилиты nc (netcat), и программы telnet.

1. Встроенные возможности Bash с использованием /dev/tcp

Bash предоставляет уникальную функциональность через специальный файл /dev/tcp, позволяющий проверять доступность портов. Вот простые и эффективные скрипты для проверки на наличие подключения:

Скрипт для одного порта

#!/bin/bash

HOST_NAME="192.168.1.99"  # Замените на нужный хост
HOST_PORT="80"             # Замените на нужный порт

if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
    echo -e "Порт: ${HOST_PORT} | ОТКРЫТ"
else
    echo -e "Порт: ${HOST_PORT} | ЗАКРЫТ"
fi

Скрипт для диапазона портов

#!/bin/bash

HOST_NAME="192.168.1.99"  # Замените на нужный хост

for HOST_PORT in {1..1000}
do
    if ( (exec 3<>/dev/tcp/${HOST_NAME}/${HOST_PORT}) 2> /dev/null); then
        echo -e "Порт: ${HOST_PORT} | ОТКРЫТ"
    else
        echo -e "Порт: ${HOST_PORT} | ЗАКРЫТ"
    fi
done

2. Использование утилиты nc (netcat)

Netcat является мощным инструментом для диагностики сетевого подключения. Он позволяет проверять, открыт ли порт, с помощью простого скрипта:

#!/bin/bash

HOST_NAME="192.168.1.99"  # Замените на нужный хост
HOST_PORT="22"            # Замените на нужный порт

if timeout 3 nc -z "$HOST_NAME" "$HOST_PORT" 2>/dev/null; then
    echo 'Порт открыт'
else
    echo 'Порт закрыт'
fi

3. Использование telnet

Хотя telnet не является самым оптимальным инструментом для этой задачи, его также можно использовать. Скрипт ниже и будет комбинировать использование telnet с grep:

#!/bin/bash

HOST_NAME="192.168.1.99"  # Замените на нужный хост
HOST_PORT="22"            # Замените на нужный порт

if telnet "$HOST_NAME" "$HOST_PORT" 2>&1 | grep -q "Connected"; then
    echo 'Порт открыт'
else
    echo 'Порт закрыт'
fi

Выводы

Каждый из описанных методов предоставляет эффективный способ проверки подключения к хостам. Использование встроенных возможностей Bash обеспечит минимальный расход ресурсов и максимальную гибкость. Netcat — более специализированное решение для сетевых проверок, а telnet подойдёт в ситуациях, когда другие инструменты недоступны.

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

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

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